Как выбрать между темой ('node', $ node) и drupal_render ($ node-> content) для программного вывода $ node - PullRequest
6 голосов
/ 08 октября 2010

Учитывая $node, я пытаюсь выбрать между следующими двумя способами вывода этого $ узла.

либо

$output = theme('node', $node);

или

node_build_content($node);
$output = drupal_render($node->content);

Похоже, что они оба дают схожие результаты, но есть ли что-то, что я должен рассмотреть, прежде чем выбрать один путь перед другим?

Ответы [ 6 ]

7 голосов
/ 08 октября 2010

Ваш вывод аналогичен, если нет других модулей и тем, изменяющих вывод через слой темы.

Но! Если вы пропустите слой темы, вы, вероятно, начнете испытывать неожиданное поведение при установке модулей или тем и изменении настроек конфигурации, которые используют слой темы для изменения вывода узла.

Короче говоря, минуя слой темы, вы встраиваете ошибки в свое приложение. Эти ошибки могут возникать после того, как вы передадите свое приложение кому-то (возможно, клиенту), который начнет изменять настройки в admin /

Смотрите шаблон декоратора, если вам интересно. Drupal широко использует это.

http://en.wikipedia.org/wiki/Decorator_pattern

6 голосов
/ 27 декабря 2010

Ну, sortof.

То, что вы действительно хотите, это

$output = node_view($node);

если вы просто вызываете node_build_content, а затем вызываете theme ('node', $ node), hook_nodeapi('alter') никогда не вызывается и hook_link().

Так что, если какой-либо модуль ожидает изменения встроенного узла, у него не будет шанса, и если на нем должны быть ссылки, они также не будут там.

Кроме того, вы можете позвонить $output = node_view($node, FALSE, FALSE, FALSE);, который даст вам узел без ссылок.

См. Документацию для node_view () .

1 голос
/ 12 июня 2012

В Drupal 7 вы должны сделать:

$elements = node_view($node, 'teaser');
$rendered_node = drupal_render($elements);
1 голос
/ 26 августа 2011

Если вы посмотрите на источник drupal_render(), он на самом деле также вызывает theme() (при условии переопределения #theme).

0 голосов
/ 08 октября 2010

Решение, которое работало здесь, было комбинацией обоих этих методов. Просто использование theme('node', $node); не работает без помощи node_build_content($node);.

Вот результат примера только с использованием theme('node', $node);.

alt text

Но если мы сначала выполним node_build_content($node); до обработки $ node для функции theme, вы увидите, что кнопка формы также отображается.

alt text

Следовательно, реальное решение:

node_build_content($node);
$output = theme('node', $node);
0 голосов
/ 08 октября 2010

Сначала рекомендуется, так как он передается через слой темы.

...