У меня только что была похожая проблема, и именно поэтому 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, но, вероятно, лучше остаться простым.