У мене тільки що було подібне питання , через що google привів мене на цю сторінку: моя функція попередньої обробки вузла зростала настільки величезно, що я скоріше розділив цю функцію на кілька файлів.
Я вже зробив подібний підхід у своєму файлі template.php, який містить усі функції alter, і оскільки той самий метод тут чудово працює, я подумав, що поділюсь своїм підходом:
налаштування файлу всередині папки MYTHEME/preprocess
:
- node.preprocess.inc
- node--blog-post.preprocess.inc
- node--device-variation.preprocess.inc
- (...)
ви вже повинні мати node.preprocess.inc
, інші, які ви можете створити самостійно. як ви їх називаєте насправді, досить умовно, але краще дайте їм імена, які добре їх ідентифікують і відповідають всій системі імен друпінгу.
далі до вмісту цих файлів!
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
файл, за винятком того, що ми знову не викликаємо функцію попередньої обробки:
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, але, мабуть, найкраще залишатися простим.