Ho appena avuto un problema simile , motivo per cui Google mi ha portato a questa pagina: la mia funzione di preelaborazione del nodo stava diventando così enormemente grande, che avrei preferito dividere la funzione in più file.
Ho già adottato un approccio simile nel mio file template.php che contiene tutte le funzioni alter, e poiché lo stesso metodo funziona perfettamente qui, ho pensato di condividere il mio approccio:
installazione file all'interno della cartella MYTHEME/preprocess
:
- node.preprocess.inc
- node--blog-post.preprocess.inc
- node--device-variation.preprocess.inc
- (...)
dovresti già avere node.preprocess.inc
, gli altri puoi creare te stesso. il modo in cui li chiami è piuttosto arbitrario, ma è meglio dare loro nomi che li identificano bene e si adattino all'intero sistema di denominazione drupal.
in seguito al contenuto di questi file!
node.preprocess.inc
, qui sto facendo qualcosa del genere:
<?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
}
passiamo sostanzialmente attraverso il tipo del nodo corrente. ciò che passi attraverso dipende da te; #id
, #view_mode
tutto a seconda delle tue esatte esigenze.
una volta che c'è una corrispondenza, caricherà il file specificato e agirà sul suo contenuto proprio come se fosse scritto proprio all'interno di questa funzione.
il contenuto di questi included
file sembra esattamente come lo avresti inserito nel node.preprocess.inc
file, tranne per il fatto che non chiamiamo nuovamente la funzione di preelaborazione:
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;
}
//...
puoi praticamente farlo con tutti i file che vuoi e persino mettere in cascata più switch, ad esempio suddividendo ulteriormente i file di preelaborazione di nodi specifici a seconda del #view_mode
, avendo un file per la full
modalità di visualizzazione e un altro per ilteaser
spero che questo aiuti, se qualcuno dovesse mai inciampare di nuovo su questa domanda (:
foo_preprocess_node
implementandolo comecall_user_func('_preprocess_' . $vars['type'], $vars);
per evitare di ripetere l'if, ma probabilmente è meglio rimanere semplici.