Responder a comentario

Sobrescritura de templates en Drupal

Todos los que trabajamos con Drupal a menudo sabemos que integrar una maqueta no es nada fácil, muchos de los módulos aportados por la comunidad y otros tantos del core de Drupal tienen sus propios templates y es muy recomendable no hacer cambios en dichos módulos, ya sea para poder actualizar más fácilmente los propios módulos(en un futuro) o poder realizar una nueva actualización de Drupal o bien para no hacer modificaciones que puedan alterar el comportamiento de nuestra aplicación ya que si cambiamos algún módulo estable aportado por la comunidad nos veríamos en la necesidad/obligación de mantenerlo nosotros mismos en nuestra aplicación sin embargo si no cambiamos el código éste será mantenido por la comunidad.

 

En Drupal tenemos varias formas de crear templates y los módulos aportados no siempre lo hacen de igual forma por tanto para poder sobrescribir los templates tendremos dos formas básicas:

 

1 – Creando una tpl en nuestro theme.

 

Por ejemplo hay módulos que declaran sus templates de la siguiente forma (que sería lo lógico):

 

/**

* Implementation of hook_theme()

*/

function nombremodulo_theme() {

return array(

'nombremodulo_block' => array(

'arguments' => array('var1' => NULL, 'var2' => array()),

'template' => 'nombremodulo-block',

));

}

 

En la misma carpeta de este módulo encontraremos la una template llamada “nombremodulo-block.tpl.php”, un ejemplo de esto lo podemos ver en el módulo profile o el módulo comment del core de Drupal.

 

Para poder sobrescribir la plantilla “nombremodulo-block.tpl.php” lo que tendremos que hacer es crear una template con el mismo nombre dentro de nuestro theme, es decir en “sites/all/themes/customtheme” o sites/midominio/themes/customtheme. La estructura quedaría más o menos así:

Profiles treetheme tree

 

 

Ahora podríamos editar la plantilla a nuestro gusto dentro de nuestro theme sin preocuparnos del módulo en cuestión.

 

2- Creando una función en nuestro template.php.

 

Otra forma que tienen algunos módulos aportados por la comunidad y el propio core de Drupal es creando el theme utilizando el hook_theme

 

/**

* Implementation of hook_theme()

*/

function nombremodulo_theme() {

return array(

'nombremodulo_block' => array(

'arguments' => array('var1' => NULL, 'var2' => array()),

));

}

 

pero sin utilizar ninguna plantilla (omitiendo el argumento 'template') como veíamos en el ejemplo anterior. En este caso utilizarían esta función dentro del módulo para mostrar la maquetación:

 

function theme_nombremodulo_block($vars) {

$items = array();

foreach ($vars as $var) {

$items[] = l($var->subject, 'node/'. $var->nid);

}

if ($items) {

return theme('item_list', $items);

}

}

 

Para poder sobrescribir este tipo de themes sin modificar el código del módulo tendremos que crear la función dentro de nuestro theme, concretamente debemos hacerlo dentro del archivo template.php (este archivo ya podríamos editarlo a nuestro gusto):

 

function customtheme_nombremodulo_block($vars) {

$items = array();

foreach ($vars as $var) {

$items[] = l($var->subject, 'node/'. $var->nid);

}

if ($items) {

return theme('custom_list', $items);

}

}

 

Si queremos para tener todo más organizado podemos dentro del archivo template.php hacer includes de otros archivos para reorganizar todas las sobrescrituras de plantillas:

 

include(path_to_theme().'/overrides/activity/template.php');
include(path_to_theme().'/overrides/tagadelic/template.php');
include(path_to_theme().'/overrides/fivestar/template.php');

 

y dentro de cada una de ellas ya incluir la sobrescritura correspondiente a su módulo.

 

Nota: Después de realizar estas acciones es necesario limpiar la caché ya que si no lo hacemos probablemente no veamos reflejados nuestros cambios y pensaremos que algo hemos hecho mal.

 

Para más información acerca de este tema recomendamos ver los siguientes enlaces (inglés):

 

Respuesta

CAPTCHA

Esta pregunta se hace para comprobar que es usted una persona real e impedir el envío automatizado de mensajes basura.
Imagen de CAPTCHA
Escriba los caracteres (sin espacios) que se deben mostrar en la imagen.