Hero

Como crear un view handler personalizado en Drupal 7

Mayo 13, 2013

estebanvalerioh
PHP
Programación
Drupal
Desarrollo de Modulos
Field API
Vistas

Si estamos trabajando en un proyecto de Drupal y estamos usando el módulo views, encontramos la opción de utilizar handlers. Estos son objetos que forman parte de las vistas y parte del flujo de construcción del query, existen handlers para los fields de las vistas, los filtros, los campos de ordenamiento, etc, y todos estos pueden ser sobrescritos para obtener un resultado personalizado.

Igualmente los handlers los podemos utilizar si tenemos un módulo creado por nosotros mismos, y necesitamos renderizar campos en las vistas, donde utilizamos valores que están almacenados en una tabla personalizada de nuestro módulo.

En el siguiente ejemplo, voy a utilizar una vista de tipo nodo, con un display de tipo página, para mostrar el título de los nodos del sistema, y el nid del nodo sobre escrito y customizado mediante un handler creado mediante el módulo propio llamado ejemplos.

  1. Indicamos al módulo, el path del handler.

En nuestro archivo ejemplos.info agregamos la siguiente línea:

files[] = handlers/ejemplos_handler_nid.inc

En mi caso, ese archivo se ve de la siguiente forma:

name = Ejemplos
description = Modulo de ejemplos.
core = 7.x
version = "7.x-1.0"
package = Custom
files[] = ejemplos.module
files[] = handlers/ejemplos_handler_nid.inc
  1. Indicamos al módulo Views de nuestro handler.

En nuestro archivo ejemplos.module, tenemos que utilizar la función hook_views_api, para indicarle al módulo de views que versión de la API de views sera soportada.

/**
 * Implements hook_views_api().
 */
function ejemplos_views_api() {
  return array("version" => "3.0");
}
  1. Implementación del hook_views_data_alter.

El lugar para implementar la función hook_views_data_alter será en un nuevo archivo llamado ejemplos.views.inc que debemos colocar en la raíz de nuestro módulo. Es importante tener claro que el archivo se va a cargar automáticamente si cumplimos el paso número 2, además de nombrar el archivo según el
estándar esperado que es nombremodulo.views.inc.

Esta función indica al módulo de Views que vamos a utilizar nuestro handler, para el field nid del nodo.

/**
 * Implements hook_views_data_alter().
 */
function ejemplos_views_data_alter(&$data) {
  $data['node']['nid'] = array(
    'title' => 'Custom node nid',
    'help' => 'Custom node nid',
    'field' => array(
      'handler' => 'ejemplos_handler_nid',
    ),
  );
}
  1. Implementación del handler.

Creamos en el módulo una carpeta que se llame handlers y le colocamos un nuevo archivo llamado ejemplos_handler_nid.inc donde implementamos el código del handler, en nuestro caso simplemente vamos a alterar la renderización del nid del nodo.

/**
 * This field handler displays a node's nid with custom text.
 *
 * @ingroup views_field_handlers
 */
class ejemplos_handler_nid extends views_handler_field_entity {

  function render($values) {

    return $values->nid . '-customizado con handlers' ;
  }
}

En la parámetro $values de la función render, encontraremos los fields además de otra información importante asociados a la vista, que podemos utilizar para nuestra implementación.

En la función anterior solo agregamos un texto a nid pero la idea es que podemos hacer cualquier cosa que requiera nuestro módulo.

  1. Utilización de nuestro handler.

Realizados los pasos anteriores vamos a poder utilizar nuestro handler. Para esto buscamos nuestro field con el título que definimos anteriormente en el handler, dentro de la lista de fields disponibles para agregar, como en la siguiente imagen:

El campo va a contar con la configuración típica y normal de todos los fields de las vistas, y podemos ver el resultado final, en la previzualización de nuestra vista de nodos, como en la siguiente imagen:

Saludos!

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