Integración con Views

A lo largo de mi trayectoria con DRUPAL, uno de los modulos de los cuales he sido muy critico es VIEWS no porque lo considere un pesimo modulos, al contrario es uno de los inpresindibles, si no por su uso excesivo para resolver todo.

Pero en este articulos tratare de explicar las bondades de este y como integrar nuestros modulos con Views.

Desde el Comienzo

hook_views_api()
Este hooks le dice a views que nuestro modulo usara views Api.

/* Implements hook_views_api(). */
function mymodule_views_api() {
 return array(
  'api' => 3,
  'path' => drupal_get_path('module', 'mymodule') . '/views',
 );
}

Con esta invocación definimos que usaremos la versión 3 de la API de Views, y que los archivos necesarios para interactuar con views estaran en el directorio modules/mymodule/views.

View necesita que tu crees un archivo llamado [tumodulo].views.inc.

hook_views_data()
Este método le entrega un array a views con las tablas que queremos que views pueda consultar.

/** Implements hook_views_data() */
function node_views_data() {
// ----------------------------------------------------------------// 
node table -- basic table information.
// Define the base group of this table. Fields that don't 
// have a group defined will go into this field by default.
$data['node']['table']['group'] = t('Content');

// Advertise this table as a possible base table
$data['node']['table']['base'] = array(
  'field' => 'nid',
  'title' => t('Content'),
  'weight' => -10,
  'access query tag' => 'node_access',
  'defaults' => array(
  'field' => 'title',
  ),
);

Usaremos la tabla nodo para nuestro ejemplos.

Unir tablas

// For other base tables, explain how we join
$data['node']['table']['join'] = array(
// this explains how the 'node' table (named in the line above)
// links toward the node_revision table.
'node_revision' => array(
'handler' => 'views_join', // this is actually optional
'left_table' => 'node_revision', // Because this is a direct link it could be left out.
'left_field' => 'nid',
'field' => 'nid',
// also supported:
// 'type' => 'INNER',
// 'extra' => array(array('field' => 'fieldname', 'value' => 'value', 'operator' => '='))
// Unfortunately, you can't specify other tables here, but you can construct
// alternative joins in the handlers that can do that.
// 'table' => 'the actual name of this table in the database',
),
);
Definiendo los campos

// ----------------------------------------------------------------
// node table -- fields

// nid
$data['node']['nid'] = array(
'title' => t('Nid'),
'help' => t('The node ID.'), // The help that appears on the UI,
// Information for displaying the nid
'field' => array(
'handler' => 'views_handler_field_node',
'click sortable' => TRUE,
),
// Information for accepting a nid as an argument
'argument' => array(
'handler' => 'views_handler_argument_node_nid',
'name field' => 'title', // the field to display in the summary.
'numeric' => TRUE,
'validate type' => 'nid',
),
// Information for accepting a nid as a filter
'filter' => array(
'handler' => 'views_handler_filter_numeric',
),
// Information for sorting on a nid.
'sort' => array(
'handler' => 'views_handler_sort',
),
);

Muchos de los keys de los arreglos son auto-explicativos, pero te preguntaras que son los handler

Handler
Los handler le informa a views como debe manejar los datos que se pasan.

Dependiendo del tipo de datos que tenemos que manejar, podremos crear o asignar los handler para cada uno de ellos. Views provee un grupo de handlers ubicados en views/handlers que tu puedes reutilizar.

Bueno eso es todo y espero que les sirva como introducción al tema de la integración de sus módulos con views.