Właśnie miałem podobny problem, dlatego Google przeniósł mnie na tę stronę: moja funkcja wstępnego przetwarzania węzła rosła tak ogromnie, że wolałbym podzielić funkcję na wiele plików.
Podjąłem już podobne podejście w moim pliku template.php, który zawiera wszystkie funkcje alter, a ponieważ ta sama metoda działa tutaj doskonale, pomyślałem, że podzielę się tym podejściem:
konfiguracja pliku w folderze MYTHEME/preprocess
:
- node.preprocess.inc
- node--blog-post.preprocess.inc
- node--device-variation.preprocess.inc
- (...)
powinieneś już mieć node.preprocess.inc
, inne, które możesz sam stworzyć. to, jak je nazywasz, jest raczej arbitralne, ale lepiej nadaj im nazwy, które dobrze je identyfikują i pasują do całego systemu nazewnictwa Drupal.
dalej do treści tych plików!
node.preprocess.inc
tutaj robię coś takiego:
<?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
}
w zasadzie przełączamy rodzaj bieżącego węzła. to, co przełączysz, zależy od ciebie; #id
, #view_mode
wszystko zależy od konkretnych potrzeb.
po znalezieniu dopasowania ładuje określony plik i działa na jego zawartość, tak jakby był zapisany bezpośrednio w tej funkcji.
zawartość tych included
plików wygląda dokładnie tak, jakbyś umieścił je w node.preprocess.inc
pliku, z tym wyjątkiem, że nie wywołujemy ponownie funkcji wstępnego przetwarzania:
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;
}
//...
w zasadzie możesz to zrobić z dowolną liczbą plików, a nawet kaskadować wiele przełączników, na przykład dalej dzieląc określone pliki przetwarzania wstępnego węzła w zależności od #view_mode
, mając jeden plik dla full
trybu widoku, a drugi dlateaser
mam nadzieję, że to pomoże, jeśli ktoś kiedykolwiek natknie się na to pytanie (:
foo_preprocess_node
, wdrażając go takcall_user_func('_preprocess_' . $vars['type'], $vars);
, aby uniknąć powtarzania ifs, ale prawdopodobnie najlepiej pozostać prosty.