У меня есть несколько типов контента, которые мне нужно предварительно обработать разными способами. Так что template.php
в моей теме на foo
данный момент выглядит так:
function foo_preprocess_node(&$variables) {
if ('news' ==$variables['type']) _preprocess_news($variables);
if ('event'==$variables['type']) _preprocess_event($variables);
if ('alert'==$variables['type']) _preprocess_alert($variables);
...
}
function _preprocess_news(&$variables) {
...
}
function _preprocess_event(&$variables) {
...
}
function _preprocess_alert(&$variables) {
...
}
Я хотел бы иметь возможность указать специфическую для Drupal функцию предварительной обработки, которая будет подключаться к имени компьютера типа контента. Я пытался использовать, foo_preprocess_news
но это никогда не называется.
Есть ли способ лучше?
foo_preprocess_node
реализациюcall_user_func('_preprocess_' . $vars['type'], $vars);
, чтобы избежать повторения ifs, но, вероятно, лучше остаться простым.hook_preprocess_node()
пользовательский модуль и надеялся, что это ограничит вызов хука, но это не так. Любой способ ограничить, когда ловушка вызывается по типу контента?if ($vars['node']->type == 'foo') { ...
достигнет желаемого эффектаhook_block_view_MODULE_DELTA_alter()
. В настоящее время я делаю то, что вы говорите, но хотелось бы, чтобы был способ ограничить, когда ударил крючок.Подтема дзен выполняет это, добавляя это к своей функции theme_preprocess_node:
Если у вас есть тип контента под названием «новости», вы сможете создать функцию с именем foo_preprocess_node_news в вашем файле template.php.
источник
У меня только что была похожая проблема, и именно поэтому Google привел меня на эту страницу: моя функция предварительной обработки узла стала настолько огромной, что я бы лучше разделил эту функцию на несколько файлов.
Я уже проделал аналогичный подход в своем файле template.php, который содержит все функции alter, и, поскольку здесь тот же метод работает отлично, я решил поделиться своим подходом:
настройка файла внутри папки
MYTHEME/preprocess
:у вас уже должно быть
node.preprocess.inc
, остальные вы можете создать сами. то, как вы их называете, на самом деле довольно произвольно, но лучше дать им имена, которые хорошо идентифицируют их и соответствуют всей системе именования drupal.далее к содержанию этих файлов!
мы в основном переключаемся через тип текущего узла. то, через что вы переключаетесь, зависит от вас;
#id
,#view_mode
Все зависит от ваших конкретных нужд.как только будет найдено совпадение, он загрузит указанный файл и будет воздействовать на его содержимое так же, как если бы он был написан прямо внутри этой функции.
содержимое этих
included
файлов выглядит точно так же, как если бы вы поместили его вnode.preprocess.inc
файл, за исключением того, что мы больше не вызываем функцию preprocess:вы можете сделать это, используя столько файлов, сколько захотите, и даже каскадировать несколько коммутаторов, например, дополнительно разделив отдельные файлы предварительной обработки узла в зависимости от
#view_mode
наличия одного файла дляfull
режима просмотра и другого дляteaser
надеюсь, это поможет, если кто-нибудь когда-нибудь снова наткнется на этот вопрос (:
источник
call_user_func()
не передает параметры по ссылке. Итак, в случае, если$variables
вашиpreprocess_foo()
функции будут работать только с копиями исходного массива; изменения не-объектов не будут применены во время оставшегося процесса рендеринга.источник
В вашем основном hook_preprocess_node Реализуйте следующий код в конце
Таким образом, вы бы сейчас препроцессировать по типу узла
источник