У меня только что была похожая проблема, и именно поэтому Google привел меня на эту страницу: моя функция предварительной обработки узла стала настолько огромной, что я бы лучше разделил эту функцию на несколько файлов.
Я уже проделал аналогичный подход в своем файле template.php, который содержит все функции alter, и, поскольку здесь тот же метод работает отлично, я решил поделиться своим подходом:
настройка файла внутри папки MYTHEME/preprocess
:
- node.preprocess.inc
- node--blog-post.preprocess.inc
- node--device-variation.preprocess.inc
- (...)
у вас уже должно быть node.preprocess.inc
, остальные вы можете создать сами. то, как вы их называете, на самом деле довольно произвольно, но лучше дать им имена, которые хорошо идентифицируют их и соответствуют всей системе именования drupal.
далее к содержанию этих файлов!
node.preprocess.inc
здесь я делаю что-то вроде этого:
<?php
function MYTHEME_preprocess_node(&$variables) {
switch($variables['type']) {
case 'blog_post':
// if the type of the node is a Blog Post, include this:
include 'node--blog-post.preprocess.inc';
break;
case 'device_variation':
// if Device Variation, include this:
include 'node--device-variation.preprocess.inc';
break;
case 'foo':
// ...
break;
}
// additional stuff for all nodes
}
мы в основном переключаемся через тип текущего узла. то, через что вы переключаетесь, зависит от вас; #id
, #view_mode
Все зависит от ваших конкретных нужд.
как только будет найдено совпадение, он загрузит указанный файл и будет воздействовать на его содержимое так же, как если бы он был написан прямо внутри этой функции.
содержимое этих included
файлов выглядит точно так же, как если бы вы поместили его в node.preprocess.inc
файл, за исключением того, что мы больше не вызываем функцию preprocess:
node--device-variation.preprocess.inc
<?php
// Device Name
$device = drupal_clean_css_identifier(strtolower($variables['title']));
// Determine whether only Device Version is of type 'N/A' and set ppvHasVariations accordingly
$deviceHasVariations = true;
if( $variables['content']['product:field_model_variation'][0]['#options']['entity']->weight == 0 ) {
$deviceHasVariations = false;
}
//...
вы можете сделать это, используя столько файлов, сколько захотите, и даже каскадировать несколько коммутаторов, например, дополнительно разделив отдельные файлы предварительной обработки узла в зависимости от #view_mode
наличия одного файла для full
режима просмотра и другого дляteaser
надеюсь, это поможет, если кто-нибудь когда-нибудь снова наткнется на этот вопрос (:
foo_preprocess_node
реализациюcall_user_func('_preprocess_' . $vars['type'], $vars);
, чтобы избежать повторения ifs, но, вероятно, лучше остаться простым.