Hero

Como crear y usar templates sugeridos en Drupal 7

Febrero 04, 2014

enzo
Drupal
Desarrollo de Modulos
Tematización

Cuando estamos creando módulos es muy común que registremos temas para nuestros módulos usando la función hook_theme(), a continuación una declaración de ejemplo

/**
 * Implements hook_theme()
 */
function MIMODULO_theme() {
  return array(
    'custom_render' => array(
      'render element' => 'elements',
      'template'  => 'custom-render',
    ),
  );
}

Lo anterior definir que existirá un archivo custom-render.tpl que formateara la salida de los parametros suministrados.

Hasta aquí no hay mucho misterio, sin embargo muchos programadores Drupal ignoran que para cada template entiendace funciones y archivos Drupal permite la ejecución de funciones de prreprocesamiento que son utilizadas para preparar las variables que van a ser utilizadas dentro del template y de esta forma evitar mezclar código con presentación. Por definición las función de preprocesamiento tienen este formato

THEME_preprocess_TEMPLATE

THEME: Nombre de nuestro theme por ejemplo barkit en caso de que necesitemos ser muy específicos, pero puede ser remplazado por template.

TEMPLATE: Sera el nombre que usamos para definir nuestra función o archivo de template.

Por tanto en nuestro ejemplo la función de procesamiento que podríamos usar seria template_preprocess_custom_render(), ahora vemos una implementación de ejemplo en donde tomaremos el primer rol del usuario para hacer algunos cambios en nuestra salida.

/**
 * Preprocess function for custom-render.tpl.php
 */
function template_preprocess_custom_render(&$vars) {
  $roles = $vars['user']->roles; 
  $main_role = user_role_load($roles[0]);
  $vars['main_role'] = $main_role->name;
  
  $vars['theme_hook_suggestions'][] = 'custom_render_' . $main_role->bundle;
}

En el ejemplo anterior se uso un supuesto dato enviado a la función theme en el índice $user y se tomo para calcular un supuesto main_role y se definió una nueva variable llamada main_role, la cual puede ser impresa en el template de la siguiente forma:

<? print $main_role; ?>

Adicionalmente hicimos uso de la variable theme_hook_suggestions que se usa internamente por la función theme(), para permitir a otros developer poder sobre escribir un template a su gusto, en este caso si enviamos la variable $user que tiene como primer role author, el developer puede implementar una función de theme llamada custom_render_author, por supuesto que deberá hacer la implementación con el hook_theme como se explico anteriormente.

La única restricción que los sugerencias de thema tienen es que aunque existan funciones de proprocess para estas nuevas funciones estas no serán ejecutadas.

Por tanto si estas peleando con alguna función theme que no puedes sobre escribir, quizás puedas contribuir una función de procesamiento al autor original y así colocar lógica para poder sobreescribir el template que te quita el sueño.

Espero que haya sido de su agrado.

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.