Enlaces e información
Comenta lo que creas oportuno.
Hook_theme en Drupal 6
Estamos empezando el desarrollo de una serie de sitios basados en Drupal 6, por lo que nos hemos puesto a crear temas nuevos y nos hemos encontrado con cosas curiosas. Aquà voy a explicar la que me ha dado más dolores de cabeza en estos dÃas que llevo con Drupal 6 y, si bien, al final es algo bastante sencillo, hay que aprenderlo.
Todo parte de la necesidad de renderizar los Primary Links con una plantilla que no sea la estándar. Se puede renderizar con la plantilla links:
< ?php print theme('links', $primary_links ); ?>
O como menu_tree:
< ?php print menu_tree($menu_name = 'primary-links'); ?>
Y luego trabajar con el CSS, pero queremos ir un poco más allá: queremos definir exactamente el HTML que nos de la gana. Nuestra llamada va a ser:
< ?php print theme('primary_links', $primary_links ); ?>
Y, aparte, tener definido un fichero de plantilla: primary_links.tpl.php donde especificamos el comportamiento de la renderización del array de enlaces.
En Drupal 5 la manera de descubrir plantillas de temas es automática, nos hubiera bastado con tener algo de lo siguiente definido, por orden de importancia:
- Fichero de plantilla (primary_links.tpl.php) para que lo hubiera utilizado.
- Funcion propia de tema (nombretema_primary_links.tpl.php) dentro del template.php.
- Funcion propia del motor del tema (phptemplate_primary_links.tpl.php) dentro del template.php.
En Drupal 6 no es automático. Hay que indicárselo al motor, el cual cacheará las llamadas para hacer el proceso más eficiente.
HabrÃa que implementar la funcion hook_theme dentro del tema (dentro de template.php) o dentro del módulo que necesite el template. Esta funcion debe devolver un array que defina como se comportan cada uno de los temas. Por ejemplo:
function nombretema_theme() {
return array(
'primary_links' => array(
'arguments' => array(
'links' => NULL
),
'template' => 'primary_links'
),
);
}
Hace básicamente lo que buscamos: Relacionar theme(hook, …) con el fichero: hook.tml.php.
Pero también podemos definir como queremos que se comporte ese hook, por ejemplo renderizando como una función del tema (comportamiento por defecto):
/**
* Implementation of hook_theme().
*/
function maristas_silvia_theme() {
return array(
'primary_links' => array(
'arguments' => array(
'links' => NULL
),
),
);
}
function nombretema_primary_links($links = array()) {
return "Renderizamos los enlaces primarios"; // Salida de ejemplo
}
En el ejemplo anterior la renderización encargada del hook la realizará una función del template.php.
Por nomenclatura se suele traducir los guiones bajos del nombre del hook (primary_links) a guiones simples al nombre del template asociado (primary-links.tpl.php).
Si se cambia la estructura de los hooks, hay que reiniciar la cache, esto se puede hacer con cualquiera de los siguientes métodos:
- En la página “Administer > Site configuration > Performance” hacer click en el botón: “Clear cached data”.
- Con el módulo devel, hacer clieck en el enlace: “Empty cache” link.
- Con la función: drupal_rebuild_theme_registry de la API.
Más información en: