Tengo un par de tipos de contenido que necesito preprocesar de diferentes maneras. Entonces template.php
en mi tema foo
actualmente se ve así:
function foo_preprocess_node(&$variables) {
if ('news' ==$variables['type']) _preprocess_news($variables);
if ('event'==$variables['type']) _preprocess_event($variables);
if ('alert'==$variables['type']) _preprocess_alert($variables);
...
}
function _preprocess_news(&$variables) {
...
}
function _preprocess_event(&$variables) {
...
}
function _preprocess_alert(&$variables) {
...
}
Me gustaría poder especificar una función de preproceso específica de Drupal que enganche el nombre de la máquina del tipo de contenido. Intenté usarlo foo_preprocess_news
pero nunca se llama.
¿Hay una mejor manera?
foo_preprocess_node
implementarlocall_user_func('_preprocess_' . $vars['type'], $vars);
para evitar repetir los ifs, pero probablemente sea mejor mantenerse simple.hook_preprocess_node()
en un módulo personalizado, y esperaba que eso restringiría cuando se llama al gancho, pero no lo hace. ¿Alguna forma de restringir cuándo se llama al gancho por tipo de contenido?if ($vars['node']->type == 'foo') { ...
el efecto que estás buscandohook_block_view_MODULE_DELTA_alter()
. Actualmente hago lo que dices, pero desearía que hubiera una manera de restringir cuando se golpea el gancho.El subtema zen logra esto agregando esto a su función theme_preprocess_node:
Si tiene un tipo de contenido llamado 'noticias', podrá crear una función llamada foo_preprocess_node_news en su archivo template.php.
fuente
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
: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!
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 elnode.preprocess.inc
archivo, excepto que no llamamos a la función de preproceso nuevamente: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 elfull
modo de vista y otro para elteaser
Espero que esto ayude, si alguien alguna vez tropieza con esta pregunta nuevamente (:
fuente
call_user_func()
no pasa parámetros por referencia. Entonces, en caso de que$variables
suspreprocess_foo()
funciones funcionen solo en copias de la matriz original; Los cambios en objetos que no sean objetos no se aplicarán durante el proceso de representación restante.fuente
En su hook_preprocess_node principal Implemente el siguiente código al final
Entonces ahora tendría que preprocesar por tipo de nodo
fuente