Drupal 6: могу ли я передавать переменные в шаблон узла с помощью вызова функции, а не только с помощью функций предварительной обработки? - PullRequest
1 голос
/ 30 марта 2011

Я работаю над сайтом, для которого мне нужно встроить весь вывод шаблона узла (для пары типов контента) в различные другие шаблоны. В большинстве случаев встраивают узел - выбранный в поле CCK привязки узла - в шаблон представления, поэтому мой текущий подход:

  • в настройках вида: добавить поле noderef непосредственно как одно из полей для вывода (в отличие от использования отношения, чтобы сделать поля ссылочного узла доступными)
  • установить формат для вывода поля на "полный узел" - который я нашел, печатает весь шаблон узла

Это здорово, НО: в шаблоне узла есть несколько важных переменных. Единственный способ, которым я уже знаю, чтобы установить их, это с помощью функции предварительной обработки, которая работает ... Раздражительность этого метода заключается в том, что в функции предварительной обработки я должен обнаружить (по тому, что там доступно), где будет выводиться шаблон встроенный, так что я могу установить переменные соответствующим образом.

Что я хочу сделать вместо этого:

Интуитивно понятно, что было бы более разумно иметь возможность вызывать функцию в моих различных шаблонах представления, которая бы: а) позволяла мне печатать весь шаблон узла, и б) передавала значения для переменных предварительной обработки. Кто-нибудь знает функцию, которая может сделать это, или альтернативный метод?

[До сих пор мысли, которые меня никуда не привели:

Я знаю, что в подобных случаях вы можете передавать опции в качестве аргументов для theme () в соответствии с сигнатурой конкретной функции темы, которая будет вызываться. Но node_view () не предоставляет такой возможности - и кажется, что node_view () является подходящей функцией для вызова шаблона узла, а не theme ('node', ...).

Я вижу, что node_view () вызывает hook_nodeapi () с 'alter' как $ op, но это происходит слишком поздно в игре; к тому времени содержимое узла уже будет в формате HTML (т.е. $ node-> body).]

1 Ответ

0 голосов
/ 31 марта 2011

Ну, есть hook_nodeapi ($ op = 'view'), если вы хотите изменить существующие элементы, вы придаете вашему модулю большой вес, чтобы он вызывался последним. Чтобы знать , когда вы хотите что-то настроить, вы можете установить пользовательский флаг для объекта узла, например, $node->yourmodule_inside_view_noderef = TRUE, прежде чем передать его в node_view ().

В Drupal 7 существует так называемая концепция $ view_mode вместо просто логического флага, показывающего тизер или нет.

Вы можете задать свои собственные view_modes с помощью hook_entity_info () , вот пример из userpoints_nodeaccess: userpoints_nodeaccess_entity_info . Это позволяет вам реагировать на основе view_mode в hook_node_view / hook_node_view_alter, но также позволяет вам настраивать, какие поля должны отображаться, как и какие view_mode следует использовать, когда узел отображается без необходимости в пользовательском коде.

...