Drupal 7 Views: templates y preprocess

Madrid, Spain

September 23, 2015 12:53 PM

Todos los que hemos desarrollado una web utilizando Drupal como CMS nos hemos topado con el módulo Views y su arquitectura de templates para poder adaptarla a los requisitos del diseño que vamos a proporcionarle a nuestro cliente.

Views

Como indicámos en el post anterior, Views es el módulo de Drupal más utilizado en la actualidad y cuenta con versiones tanto para Drupal 6 como para Drupal 7. Se trata de un potente motor que nos permite realizar desde su interfaz (UI) todo tipo de consultas a la base de datos y determinar cómo será mostrada a los usuarios.

Arquitectura de Views

Views permite que los resultados de la consulta sean mostrados en bloques, páginas, feeds RSS, etc, denominados Displays así como configurar si deseamos que aparezca en un listado, una tabla, un gráfico, slideshow, etc, denominados Styles. Todo gracias a una potente API que permite a módulos adicionales implementar cada una de las capas.

La arquitectura de Views consta de tres niveles:

  • Display
    Drupal Views displays
  • Style
    Drupal Views styles
  • Row style
    Determinan el estilo de cada fila.
    Drupal Views row styles

Views templates

Esta estructura se ve reflejada en la forma en la que Views genera el HTML de salida, cada uno de los niveles responde a un template diferente.

Drupal views templates

Views da la posibilidad de que cada tema pueda sobreescribir cada uno de estos niveles: de forma genérica, por vista, por style, por campo, e incluso por las posibles combinaciones, dando al themer la mayor flexibilidad posible.

Views preprocess y process

A parte de los diferentes templates que ofrece Views, también existe la posibilidad de personalizar la salida de cada vista programáticamante con PHP. Hace uso del sistema de Drupal de funciones preprocess y process en el fichero template.php de los temas.

Diferencias entre Drupal 6 y Drupal 7

En Drupal 6 existía una función preprocess por cada alternativa de template existente. Era imprescindible la existencia del template para que la función se ejecutase.

En Drupal 7 esto ha cambiado:

  • se ha eliminado la necesidad de esté definido el template para que la función preprocess se ejecute.
  • no es posible determinar una función específica para cada vista, quedando sólo funciones preprocess y process genéricas:
    • mytheme_preprocess_views_view(&$vars) - genérica para todas las vistas
    • mytheme_process_views_view(&$vars) - genérica para todas las vistas
    • mytheme_preprocess_views_view_list(&$vars) - genérica para el List Style
    • mytheme_preprocess_views_view_field(&$vars) - genérica para cada Field
    • etc.

Existe una issue para poder implementar las funciones preprocess y process por cada vista al igual que en Drupal 6 en Drupal 7 y 8, pero está aún en desarrollo (ver issue).

Hasta entonces os proporcionamos una forma de poder lograrlo:

<?php
/**
  * Generic preprocess that is still working on D7
  */
function MYTHEME_preprocess_views_view_fields(&$vars) {
  if (isset($vars['view']->name)) {
    $function = __FUNCTION__ . '__' . $vars['view']->name . '__' . $vars['view']->current_display;
   
    if (function_exists($function)) {
     $function($vars);
    }
  }
}

/**
  * Then the specific preprocess that worked without the above code for D6
  */
function MYTHEME_preprocess_views_view_fields__VIEWNAME__DISPLAY(&$vars) {
  // my specific preprocess code
}
?>