Acabo de tener un problema similar , por eso Google me trajo a esta página: mi función de preproceso de nodo estaba creciendo tan enormemente que preferiría dividir la función en varios archivos.
Ya hice un enfoque similar en mi archivo template.php que contiene todas las funciones alter, y dado que el mismo método funciona perfectamente bien aquí, pensé en compartir mi enfoque:
configuración de archivo dentro de la carpeta MYTHEME/preprocess
:
- node.preprocess.inc
- node--blog-post.preprocess.inc
- node--device-variation.preprocess.inc
- (...)
ya deberías tener node.preprocess.inc
los otros que puedes crear tú mismo. cómo los llamas realmente es bastante arbitrario, pero mejor dales nombres que los identifiquen bien y se ajusten a todo el sistema de nombres de drupal.
en adelante al contenido de estos archivos!
node.preprocess.inc
, aquí estoy haciendo algo como esto:
<?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
}
básicamente cambiamos por el tipo del nodo actual. lo que cambies depende de ti; #id
, #view_mode
todo dependiendo de sus necesidades exactas.
una vez que haya una coincidencia, cargará el archivo especificado y actuará sobre su contenido como si estuviera escrito dentro de esta función.
el contenido de estos included
archivos se ve exactamente como lo pondría en el node.preprocess.inc
archivo, excepto que no llamamos a la función de preproceso nuevamente:
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;
}
//...
Básicamente, puede hacer esto con tantos archivos como desee e incluso conectar en cascada múltiples conmutadores, por ejemplo, dividir aún más archivos de preprocesos de nodos específicos dependiendo de #view_mode
, tener un archivo para el full
modo de vista y otro para elteaser
Espero que esto ayude, si alguien alguna vez tropieza con esta pregunta nuevamente (:
foo_preprocess_node
implementarlocall_user_func('_preprocess_' . $vars['type'], $vars);
para evitar repetir los ifs, pero probablemente sea mejor mantenerse simple.