Если честно, я никогда не видел эту функцию (NEWCONTEXTFROMHIERARCHY
), но это то, что мне удалось сделать. Я сделал функцию, которая создает необходимую часть иерархического дерева и объединяет два дополнительных параметра (базовый продукт и продукт). Затем я использовал newcontextfromhierarchy
. Таким образом, функция возвращает весь узел.
create or replace function xml_hier(i_id in varchar2, i_base in varchar2, i_name in varchar2) return xmltype is
v_ret xmltype;
begin
select dbms_xmlgen.getxmltype(dbms_xmlgen.newcontextfromhierarchy('
with t as (
select level lvl, xmlelement("PGR", XMLATTRIBUTES(NAME))
from PRODUCTGROUPS
where id in (select id
from PRODUCTGROUPS
connect by prior PARENTID = ID start with id = '||i_id||')
connect by PARENTID = prior ID
start with parentid is null)
select * from t
union all
select (select max(lvl) + 1 from t), XMLELEMENT("PRO", XMLATTRIBUTES('''||i_base||''' as "name")) from dual
union all
select (select max(lvl) + 2 from t), XMLELEMENT("PRV", XMLATTRIBUTES('''||i_name||''' as "name")) from dual'))
into v_ret
from dual;
return v_ret;
end;
Итак, с созданными вами таблицами я запускаю:
select p.id,
xmlroot(
xmlelement("IMPORT",
xml_hier(g.id, p.baseproduct, p.name))
, version '1.0" encoding="utf-8') as xml
from products p
join productgroups g on p.productgroupid = g.id;
и в результате получаю:
<?xml version="1.0" encoding="utf-8"?>
<IMPORT>
<PGR NAME="Product Group 1">
<PGR NAME="Product Group 1-1">
<PGR NAME="Product Group 1-1-1">
<PRO name="Product X">
<PRV name="Product Variant 1"/>
</PRO>
</PGR>
</PGR>
</PGR>
</IMPORT>
Иерархический запрос сначала работает в обратном направлении, в порядке найти предков. Затем все идет нормально, используя только уже известные id
.
Надеюсь, это поможет:)
Я искал способ вытянуть данные узла через ajax и предложил следующее решение для Drupal 6. После реализации изменений ниже, если Вы добавляете ajax=1 в URL (например, mysite.com/node/1?ajax=1), Вы получите просто содержание и никакой макет страницы.
в template.php файле для Вашей темы:
function phptemplate_preprocess_page(&$vars) {
if ( isset($_GET['ajax']) && $_GET['ajax'] == 1 ) {
$vars['template_file'] = 'page-ajax';
}
}
затем создайте страницу-ajax.tpl.php в своем каталоге темы с этим содержанием:
<?php print $content; ?>
Существует также http://drupal.org/project/pagearray , который является общим решением ...
Кроме того, решение @Scott Evernden является перекрестным дыра в безопасности скриптов сайта (XSS). Не делай этого. Прочитайте документацию на drupal.org о том, как обрабатывать текст безопасным способом http://drupal.org/node/28984
Для тех, кто может попасть на эту страницу, если вы просто работаете со стандартными обратными вызовами (не обязательно с представлениями), это легко. В вашей функции обратного вызова вместо возврата кода для визуализации на странице используйте функцию «print».
Например:
function mymodule_do_ajax($node)
{
$rval = <<<RVAL
<table>
<th>
<td>Data</td>
<td>Data</td>
<td>Data</td>
</th>
<tr>
<td>Cool</td>
<td>Cool</td>
<td>Cool</td>
</tr>
</table>
RVAL;
//return $rval; Nope! Will render via the templating engine.
print $rval; //Much better. No wrapper.
}
Ура!
Это называется топологическая сортировка .
-121--4746570-Каноническое применение топологическая сортировка (топологическая order) находится в планировании последовательности задания или задачи; топологическая сортировка алгоритмы были впервые изучены в начало 1960-х годов в контексте PERT методика планирования в проекте управление (Ярнагин 1960). Задания представлены вершинами, и там является ребром от x до y, если задание x должно быть завершенным до выполнения задания y запущено (например, при стирке одежда, стиральная машина должна закончить, прежде чем положить одежду сухой). Затем топологическая сортировка дает порядок выполнения заданий.
Другие ответы великолепны; Мне не нужно повторять это. Но у меня есть некоторые дополнительные комментарии.
Не помещайте данные сеанса (весь сеанс) в файл cookie, а только идентификатор сеанса, возможно хэшированный. Для людей пути слишком легко редактировать содержимое файла cookie. Оставьте данные сеанса на сервере; возможно, в базе данных, если у вас много одновременных пользователей или сеансы работают очень долго.
Если даже сам идентификатор сеанса очень ценен, его можно даже поместить в параметр POST, тем самым предотвращая его появление в самом URL.
-121--3796824- Простой способ отображения содержимого специального типа, которое вы хотите отобразить, без всего содержимого page.tpl.php
:
Добавьте в файл template.php
следующий фрагмент:
function mytheme_preprocess_page(&$vars) {
if ($vars['node'] && arg(2) != 'edit') {
$vars['template_files'][] = 'page-nodetype-'. $vars['node']->type;
}
}
Добавьте page-nodetype-examplecontenttype.tpl.php
к теме, например page.tpl.php
, но без материала, который вы не хотите отображать, и с помощью распечатайте $ content
в теле.
Эй, вот еще один способ сделать это:
1) Загрузите и установите бонусный пакет просмотров ( http://drupal.org/project/views_bonus ) 2) Создайте отображение «Feed» в представлении и используйте стиль «XML» (или что-то, что, по вашему мнению, лучше соответствует вашим потребностям). 3) Если вас не устраивает стандартный вывод XML, вы можете изменить его, настроив шаблон для представления. Проверьте настройки «темы», чтобы получить предложения по альтернативным именам шаблонов для этого конкретного представления (чтобы у вас по-прежнему оставался выходной XML по умолчанию для будущего использования).
Удачи! // Йохан Фальк, NodeOne, Швеция