Views 3. A fondo

En febrero de 2011, Katherine Szensee me contactó para invitarme a participar de un Sprint sobre Views 3 que se realizaba en San Francisco, donde vive Earl Miles, el creador del módulo Views, Panels, CTools y muchos otros. Por razones de Visa el viaje no fue posible sin embargo estuve en contacto con muchos de los desarrolladores que participaron en ese sprint y hasta pude colaborar con algo de código para esa ocasión.

Más allá del viaje fallido, estoy bastante al tanto de los últimos cambios que tuvo Views 3, muchos de ellos los programamos en conjunto con Daniel Wehner, quien es el actual co-mantainer de Views. Y por lo tanto, antes de que se me olviden, voy a intentar contar las novedades introducidas y algunas cosas que quedaron todavía por terminar.

Como bien dice Pedro Cambra en su artículo Módulo Views: Qué es, cómo se instala y cómo crear nuestra primera vista


Views es el query builder de Drupal, es decir un constructor de consultas que permite mostrar vistas de datos previamente informados en la aplicación Drupal. A través de la interfaz de usuario de Views podemos seleccionar el origen de los datos, los campos a mostrar, las condiciones por las que filtrar, ordenación y muchas otras cosas que iremos viendo en esta serie de artículos. En resumen, es la alternativa a escribir consultas manualmente en SQL e incluirlas en código PHP.

Plugins y Handlers

Quién haya utilizado alguna vez este módulo sabrá que pueden hacerse muchísimas cosas con el. Desde un simple listado de los últimos diez comentarios, como los que figuran a la izquierda de este artículo, hasta una compleja galería de imágenes con elementos anidados. Gran parte de esta flexibilidad radica en la arquitectura interna de Views, que consiste básicamente en dos clases de objetos. Por un lado los plugins y por otro lado los handlers.

Views organiza sus partes únicas, como el diseño del listado en general (si va a ser una tabla, una grilla, o una lista sin formato), o el tipo de display (un bloque, una página, un feed, etc) en forma de plugins.

Los usuarios pueden elegir entre una lista de plugins para cambiar el comportamiento de una vista. Por ejemplo, a la hora de elegir como se verá el pager de una vista, tenemos las siguientes opciones:

Plugins disponibles para usar como pager

Cada una de las opciones anteriores representa un plugin. Y como tal, puede tener sus propias opciones de configuración. Además, otros nuevos plugins pueden ser descargados e instalados en forma de módulos, para tener más opciones de configuración.

Por otro lado, los Handlers agrupan todas aquellas estructuras que pueden tener una o más instancias dentro de una vista. Por ejemplo, un filtro, es un ejemplo de handler. Una vista puede tener uno o más filtros. Al igual que los plugins, los handlers pueden extenderse desde módulos de drupal, por ejemplo el módulo Date, provee sus propios handlers para mostrar fechas, o usar argumentos especiales.

El plugin para Querys

Tal como indicó Earl Miles en un artículo ya bastante antiguo, la razón por la cual se creo el branch 3.x de Views fue por la introducción de un nuevo plugin para el backend de sql. Con esta modificación una nueva capa de abstracción se incorporó a Views, haciendo posible que los datos no solo sean cargados desde una base de datos sino desde otras fuentes.

Otra de las ventajas que provee convertir el sistema de recolección de datos a un plugin es que pueden obtenerse los datos de views desde varias bases de datos. Un artículo interesante sobre este tema puede encontrarse en el blog de Lullabot.

El sistema de búsqueda de Apache Solr fue uno de los beneficiados con este sistema también, pues incluye un plugin que permite mostrar en forma de vistas los resultados arrojados por Apache Solr.

Query backend pluggable

Hay varios proyectos en desarrollo para constuir views en base a distintas fuentes de datos, uno de los más interesantes tal vez sea: Feeds View Parser.

Pager, Exposed Forms y Localización como plugins

Luego de que se convirtiera en plugin el sistema de consultas de views, muchas de las mejoras que siguieron consistieron en hacer conectables (pluggables) y por lo tanto expansibles, otros elementos de una vista.

Como se mencionó anteriormente, los paginadores ahora son conectables, el módulo Views Infinite Scroll es un ejemplo de las posibilidades que implica poder extender partes de una vista.

Para un proyecto en el que estuve trabajando, necesitabamos realizar una interfaz de filtrado realmente compleja, en donde cada filtro pudiera ser aplicado más de una vez de forma dinámica. En ese momento, con Views 3 es sus primeras etapas de desarrollo propuse convertir los formularios expuestos de una vista a un nuevo plugin. De esta manera podría crear mi propio módulo para personalizar el formulario como era necesario y otros podrían hacer lo mismo. El módulo en cuestión se llama Advanced Exposed Filters y aunque ahora su desarrollo esta en suspenso es probable que en un futuro vuelva a trabajar en él.

La introducción de los formularios expuestos como plugins permitió que ahora se puedan elegir entre dos formas de filtrar una lista, la forma estándar y una bajo demanda que consiste en mostrar los resultados una vez que se definió un filtro en particular.

Un elemento interesante a tener en cuenta sobre la arquitectura de los plugins es que tal vez simplemente buscamos modificar una parte minúscula en el funcionamiento general de un sistema, al ser cada handler y cada plugin una clase de PHP aislada, es posible generar un plugin personalizado que herede la mayoría de las características de una clase y especifique el comportamiento particular sobreescribiendo solo algunas funciones. Un ejemplo de esto puede verse en como se implementó el plugin views_exposed_form_input_required donde solo tres funciones son redefinidas y todo lo demás se hereda del plugin padre.

Gracias a Nedjo Rogers se definió la arquitectura conectable para la localización de las vistas. A simple vista esto puede parecer trivial, sin embargo, las vistas, dada la cantidad de elementos que contienen y los cientos de parámetros configurables, son bastante difíciles de traducir en su totalidad. El plugin de Localización permite que otros módulos como i18n provean métodos más elaborados para traducir partes de una vista, y hasta incluso posibilitar a otros plugins a definir sus formas de traducir sus componentes internos.

Ordenamientos expuestos, el Botón Reset y Filtros OR

Como consecuencia de la introducción de los formularios expuestos conectables, una serie de funcionalidades fueron más fáciles de implementar.

Karen Stevenson una de las mantainers de CCK y creadora del módulo Date había comenzado hacía algún tiempo una implementación de ordenamientos expuestos. Debido a las limitaciones de Views 2 el desarrollo estaba bastante complicado. Luego de que los formularios expuestos se flexibilizaran, fue más simple la codificación de esta funcionalidad y con Daniel Wehner y otros desarrolladores terminamos la implementación de filtros expuestos para Views 3.

Entre la configuraciones de los filtros expuestos también se incorporó la posiblidad de incluir un botón de reinicio del formulario, y configurar el nombre a mostrar para el botón de filtrado.

Configuraciones de los formularios expuestos

Para cerrar con la cuestión de los filtros, cabe destacar una mejora importantísima dentro de las opciones de filtrado que es la posibilidad de usar operadores del tipo OR entre filtro y filtro.

Esto da lugar a vistas del tipo: Mostrar todos aquellos publicados Y que contengan en el título la palabra Wordpress O la palabra Drupal.

Filtros utilizando el operador OR

Esto en views 2 se lograba con el módulo Views Or.

Encabezados y pie de páginas múltiples

Una funcionalidad bastante buscada por los desarrolladores de Drupal es la posibilidad de mostrar varios encabezados para una vista. Por ejemplo, un encabezado podría mostrarse siempre, y otro solo cuando haya resultados válidos para la vista en cuestión.

La implementación de esta funcionalidad requirió de una excepción al concepto de Plugins y Handlers. Para ver la discusión completa del problema recomiendo leer el issue original.

En resumen, esta nueva capa de abstracción permite que existan módulos como Views Link Area que hace posible la creación de los típicos links "Crear un nuevo evento" cuando no hay eventos que mostrar en la lista eventos.

Otra aplicación en desarrollo para estas nuevas áreas es la creación de un Área que incluya HTML y sea traducible. El issue esta en este link http://drupal.org/node/1031962

Agregaciones GROUP BY y HAVING y operaciones matemáticas

Obtener una lista de cuantos nodos habia creado cada usuario en Drupal 5 era prácticamente imposible usando el módulo Views.

Para la versión 2.x existía Views Calc que permitía obtener sumas de cada campos o cantidades. Sin embargo este sistema funcionaba solo si la vista tenia forma de tabla.

Con Views 3 se introduce la posibilidad de la agregación de campos. Ahora es posible listar por ejemplo, cuantos nodos de cada tipo hay, lo que sería en SQL "SELECT COUNT(*), type FROM node GROUP BY type" las agregaciones pueden utilizarse también en los filtros permitiendo el uso de HAVING en consultas sql.

La forma de activar esta opción es tal vez un poco compleja, y consiste primero en habilitar la opción "Use aggregation" dentro de las opciones avanzadas, y luego por cada campo o filtro, definir si se usa agregación o no.

Otra novedad viene de la mano del módulo CTools que es una dependencia de Views 3, y permite realizar operaciones con las filas de una vista. Por ejemplo multiplicar una fila por otra.

Cuestiones estéticas

Cuando Drupal Gardens empezó a crecer, muchos vieron que necesitaban incluir Views para que el sistema sea realmente flexible.

La gente de Acquia fue la que financió el Sprint que mencionaba al principio del artículo y entre muchas mejoras de implementación, lo que se buscaba era hacer Views 3 mucho más amigable para el usuario final, y terminar la migración hacia Drupal 7.

Hay que admitir, que más allá del choque que signifique pasar de Views en Drupal 6 (probablemente de la versión 2) a Views 3 en Drupal 7 (que también está para Drupal 6 pero sin las mejoras en la interfaz de usuario), el resultado es realmente notable.

Básicamente lo que se hizo fue simplificar las tareas cotidianas. Cuando uno quiere crear un listado de contenidos, probablemente quiera mostrarlo en una página, o tal vez en un bloque, o tal vez en ambos. Todo ese proceso que antes llevaba unos minutos y muchos clics de configuración ahora están agrupados en un asistente que permite obtener la vista básica buscada en pocos segundos. Vean el video de Pedro Cambra para un ejemplo rápido.

Asistente para crear views básicas

Otras de las cuestiones que se modificaron fue la agrupación de los elementos de la interfaz, y otros conceptos fueron renombrados. Por ejemplo, los argumentos ahora se llaman (en Drupal 7) Filtros Contextuales, y muchas opciones están ocultas bajo un grupo llamado Opciones avanzadas.

El largo camino por recorrer

Aún quedan cosas por hacer, muchas cosas...

Por desgracia, yo puedo hablar sólo de mis parches, que son los que conozco en profundidad... Seguramente haya otras novedades interesantes en las inmensidades de la issue queue de views.

Por nombrar dos bastante útiles:

Pluggable Breadcrumbs Dar la posibilidad de que los Breadcrumbs sean extensibles, esto permitiría no tener que depender de varios módulos para crear Breadcrumbs o evitar cientos de lineas de código. El issue es: http://drupal.org/node/1052312

Hybrid Exposed Filters Esto es algo realmente interesante, y realmente difícil de implementar :) consiste en crear grupos de filtros expuestos con un significado en particular, por ejemplo, el operador "Mayor que" y el valor 18, agrupado en un único elemento nombrado "Mayor de edad". O por ejemplo para páginas de inmobiliarias, mostrar departamentos de 1, 2, 3 o "Más dormitorios". Esa es la idea, en la práctica hay algunas cuestiones complejas de codificar que necesitan la colaboración de programadores generosos y con tiempo libre. El issue: http://drupal.org/node/731662

El cierre

Explicar View de forma exhaustiva es bastante aburrido y podría ser material para varios capítulos de un libro. Ni hablar de como programar elementos de views.

Sin embargo hay que tener siempre presente que la capacidad de extensión de Views está centrada en su arquitectura de plugins y handlers. Estos pueden ser programados o heredados y extendidos parcialmente.

Muchos módulos proveen de handlers y plugins propios, si está interesando en aprender a programarlos le recomiendo que vea el código del módulo http://drupal.org/project/views_plugin_examples

Faltaron varios temas por tratar, especialmente relacionados con el theming, por ejemplo Semantic Views ya es parte de Views 3 de forma nativa y no se mencionaron muchos plugins de displays como Views Accordion o la posibilidad de crear formularios usando views como base pero... a esta altura dudo que alguien haya leído todo hasta acá, así que da igual...

Hasta la próxima.

Te invito a leer también...

Compartir este material en...

Comentarios

buenas amigos de cuenco digital
Estoy desarrollando una web con drupal 7 el problenma que tengo es que quiero mostrar en el teaser
la imagen en miniatura a la derecha y a la izquierda el titulo con el resumen del articulo.
Ya he podido mostrar todo lo dicho anteriromente pero me sale de manera vertical el titulo, la imagen y el resumen no en el oreden que deseo.
amigos no se como me podrian ayudar a hacer esto posible ya que no tengo mucho conocimiento en manejar los templates.
gracias.
ejemplo
http://elcomercio.pe/
si con la imagen de los videos seria mucho mejor

Hola Didier. ¿Conseguiste solucionarlo? Yo tengo el mismo problema que tu.
Me he instalado contemplates, pero cada vez que intento hacer algo me salen avisos de error!
Si al menos encontrara un videotutorial indicando los pasos a seguir...
Gracias
Gabi


Hybrid Exposed Filters Esto es algo realmente interesante, y realmente difícil de implementar :) consiste en crear grupos de filtros expuestos con un significado en particular, por ejemplo, el operador "Mayor que" y el valor 18, agrupado en un único elemento nombrado "Mayor de edad". O por ejemplo para páginas de inmobiliarias, mostrar departamentos de 1, 2, 3 o "Más dormitorios". Esa es la idea, en la práctica hay algunas cuestiones complejas de codificar que necesitan la colaboración de programadores generosos y con tiempo libre. El issue: http://drupal.org/node/731662

Nosotros lo de o más dormitorios lo hemos resuelto para un proyecto inmobiliario, al final tiramos por un query alter para modificar la vista.

En cuanto salga el proyecto hablamos de lo que hemos hecho con views, por si da ideas.