En Drupal, una vista es un listado de información. Esta puede ser una lista de nodos, usuarios, comentarios, términos de taxonomía, etc. Una vista escanéa tu sitio web usando cualquier criterio que especifiques y presenta los resultados en el formato de tu preferencia. Ejemplos de formato incluyen una table HTML, un feed RSS, un documento PDF, un documento CSV, un mapa interactivo, un carrusel de imágenes, o una representación JSON a ser usada mediante un API REST. El mismo contenido se puede presentar en múltiples formatos al mismo tiempo. Por ejemplo, puedes presentar una table de información de usuarios y en la misma página un enlace de descarga de los datos en formato CSV.
Continuemos nuestro trayecto de aprender más conceptos de Drupal. Como habrás podido notar, se relacionan unos con otros. Hoy, aprenderás como nodos, tipos de contenido y campos pueden usarse como parte de configuraciones de vistas. También, encontrarás ejemplos de bloques que son creados usando vistas.
Aprendiendo terminología de Vistas
Hay tres conceptos clave que debes conocer: el módulo Views, el módulo Views UI, y una instancia de una vista. El módulo Views (Vistas) es el motor de todo el sistema. En ocasiones descrito como un fabricador de consultas SQL, permite extraer datos almacenados en la base de datos de Drupal, ensamblar una lista de resultados, y presentarlos en varios formatos de salida. Uno de los grandes beneficios que provee es que los constructores de sitios no necesitan saber SQL o detalles sobre la estructura de base de datos. Tener conocimiento básico de conceptos de Drupal como nodos, tipos de contenido y campos es más que suficiente en la mayoría de los casos. Usando el módulos Views UI es posible instancias de vistas las cuales encapsulan la configuración de qué elementos mostrar y cómo.
El módulo Views UI (Vistas UI) es la interfaz de usuario visual del sistema. Este ofrece un asistente de formulario que te guía en el proceso de creación y configuración de una vista. Una vez que todas las vistas para un sitio han sido creadas, el módulo Views UI puede desinstalado y las instancias individuales de vistas seguirán funcionando. Por un lado, ganas un poco de rendimiento pues hay menos código a ejecutar al cargar una página. Pero más importante, los editores no podrán modificar las configuraciones de las vistas usando la interfaz administrativa en ambientes de producción. Los constructores de sitios podrán continuar haciendo cambios en los ambientes de desarrollo a medida que sea necesario. Luego, pueden mandar sus cambios como parte de sus procedimientos habituales de despliegue de configuración.
La instancia de una vista es un conjunto de configuraciones que describen cómo datos en Drupal van a ser recolectados y presentados a los visitantes del sitio. Una misma vista puede tener múltiples presentaciones. Algunas presentaciones posibles incluyen una página (page) disponible bajo cierta ruta de URL, un bloque que será colocado en una región de tema, o un agregador (feed) a ser exportado en formatos RSS u OPML. Cada tipo de presentación te permitirá especificar un formato de salida. Los posibles valores dependen según el tipo de presentación. En el caso de la presentación de página alternativas válidas incluyen listas sin formato, tablas, listas HTML y cuadrículas. Las presentaciones y formatos de salida son provistos por módulos. A medidas que habilitas más módulos del núcleo o instalas nuevos módulos contribuidos, puede obtener más opciones. Vista esta página para una lista de módulos que extienden la funcionalidad de Vistas.
Consejo: La interfaz de usuario de vistas (Views UI) contiene algunas inconsistencias que te pueden confundir si no estás familiarizado con ellas. Una es que se utiliza la palabra “Contenido” para hacer referencia a nodos, como en la primera página del asistente de creación de vistas. Otra es que, a diferencia de la configuración “Alias de URL” de la página de edición de nodos, la configuración de ruta de la vista no produce un error de validación si este no empieza con una símbolo de barra (/). Estas y otras sutiles diferencias existen, pero son poco significativas si consideramos todos los beneficios que nos da el sistema en general.
Nota técnica: Es posible ver la consulta SQL que Drupal ejecuta para extraer la lista de resultados. Ve a la página “Configuraciones de vistas” ubicada en /admin/structure/views/settings y selecciona la opción “Mostrar la consulta SQL” de la sección “Configuración de vista previa en vivo” Luego puedes ir a cualquier vista y cuando presiones el botón “Vista previa de la actualización” verás la consulta SQL que Drupal envía. Como un ejemplo, dale un vistazo a la vista que muestra la página inicial configurada en /admin/structure/views/view/frontpage Nota que los nombres de tablas aparecen entre símbolos de llaves ({}). Esto es porque Drupal permite definir prefijos de tablas para compartir la base de datos con otras aplicaciones. A pesar que esto rara vez es útil, es posible configurarlos. Para trabajar con esto, el API de Vistas usa las llaves para indicar que los nombres de las tablas deben ser procesados para añadir los prefijos de tabla en caso que se hayan especificados.
¿Cómo funcionan las vistas en Drupal?
Esta sección asume que el módulo Views UI está habilitado. Para crear una vista la página “Agregar vista” ubicada en /admin/structure/views/add. En “Opciones de vista > Mostrar” debes seleccionar que tipo de listado deseas crear: contenido (nodos), usuarios, comentarios, archivos, etc. También puedes indicar cómo quieres presentar los resultados: una página con un feed RSS opcional o un bloque. Después de este formulario inicial se presenta la interfaz de configuración completa donde las opciones de lo que puedes hacer son virtualmente infinitas. La selección inicial de qué quieres mostrar (contenido, usuarios, etc.) no se puede cambiar después de ser establecida porque sirve como tabla base a usar para recolectar los datos. Excepto por eso y el nombre de sistema de la vista, todas las configuraciones se puede cambiar en cualquier momento usando esta interfaz- En lugar de crear una vista desde cero, veamos algunos ejemplos que vienen con el perfil de instalación estándar de Drupal. Esto nos permitirá entender mejor cómo funciona la interfaz de Views UI.
La vista de página inicial (frontpage) se configura en /admin/structure/views/view/frontpage. Viene con dos presentaciones: página (page) y agregador (feed). La página estará disponible en la ruta /node con un formato de lista sin formato. Se va a mostrar Contenido (nodos) usando el modo de visualización (view mode) resumen. Porque estamos mostrando un modo de visualización, no hay campos individuales a presentar. Usar modos de visualización es preferible que mostrar campos. Una razón es porque se beneficia de cachés a nivel de entidades. La sección criterios de filtrado especifica las condiciones que deben cumplir los nodos para aparecer en la lista final de resultados. En este caso, el nodo debe estar publicado y promocionado a la página inicial. Nota que no hay un criterio de filtrado para el tipo de contenido. Sin embargo, en una instalación de Drupal por defecto todos los artículos aparecen en la página inicial y ninguna página básica se muestra ahí. La razón es que, por defecto, los artículos están configurados para ser promocionados a la página inicial mientras que las páginas básicas no.
De vuelta a la interfaz de Views UI para la vista de página inicial, en la sección criterio de ordenación podemos ver dos valores. El primero hace que aparezcan de primero aquellos los nodos marcados con el estado fijo al comienzo de las listas. El segundo ordenará los nodos en base a la fecha de creación. Cuando hay más de criterio de ordenación, el orden en que se definen es importante. Cualquier criterio que aparezca primero en la lista tomará precedencia sobre aquellos que se definen luego. Esta presentación de vista es usado por la página inicial por defecto en Drupal. Nota que su ruta /node viene configurada como la página inicial en /admin/config/system/site-information en una instalación estándar. La segunda presentación de la vista es un agregador (feed) cuya configuración es casi igual que la de la página. Las diferencias relevantes son la ruta, el formato y la configuración de modo de visualización: /rss.xml, formato de canal de noticias RSS, and modo de visualización RSS, respectivamente.
Algunas veces queremos crear una vista para presentar una lista de elementos, pero queremos permitir al usuario final filtrar la lista o cambiar el orden en que se ordena. Esto es posible usando exponiendo criterios de filtrado y ordenación. Un buen ejemplo de esto es la interfaz de administración de todos los nodos en Drupal que se encuentra en /admin/content. Su interfaz de configuración está disponible en /admin/structure/views/view/content. Esta vista muestra siete campos en formato tabla: formulario de operaciones masivas de nodo, título, tipo de contenido, nombre de usuario, estado de publicación, fecha de modificación y enlaces de operación. En la sección de criterios de filtrado, cuatro elementos han sido expuestos permitiendo que el editor de contenido filtre la lista basado en el título del nodo, el tipo de contenido, el estado de publicación y el idioma. Esta vista no usa criterios de ordenación expuestos, pero su funcionalidad y presentación es similar a la de los filtros expuestos. No obstante, porque se utiliza un formato de tabla, algunos encabezados se configuraron de forma tal que al darles clic la tabla se ordene en base a ese campo en particular. Esta es una manera diferente de permitir que el usuario final sobrescriba los resultados que se presentan por defecto.
Es importante notar cuatro cosas en el ejemplo anterior. Primero, un campo de vista no siempre es un campo adjuntado a un tipo de contenido, como el que provee la columna “operaciones” en la tabla. El reutilizar la palabra “campo” en este contexto es un tanto desafortunado. Segundo, la liste de campos en la secciones campos y criterios de filtrado no tiene que ser la misma. Tercero, el elemento de formulario (cuadro de texto, lista desplegable, etc.) que permitirá al usuario filtrar la lista depende del tipo de campo que se está procesando. Cuarto, cuando un usuario filtra la lista, el formato de la presentación original se preserva, una tabla con siete columnas en este caso.
Consejo: El nucleo de Drupal incluye al menos 14 vistas por defecto. Estudiarlas es una buena manera de aprender más sobre cómo funciona el sistem de Vistas. Para el lector curioso, dar un vistazo a las vistas ¿Quién es nuevo? (Who’s new) y ¿Quién está en línea? (Who’s online block) para ejemplos de presentaciones de bloque. Ambas están disponibles en /admin/structure/views. Si quieres jugar con ellas sin tener que configurar ambientes de desarrollo locales, sugiero usar https://simplytest.me/ En este sitio puedes probar el núcleo de Drupal y módulos, temas y distribuciones del repositorio de contribución en cuestión de minutos.
Nota técnica: Al ser un fabricador de consultas SQL, algunos elementos de la interfaz de Views UI se pueden mapear a conceptos de SQL. La sección campos corresponde a columnas de tablas a incluir en una sentencia SELECT. Las relaciones agregar cláusulas JOIN a la consulta. Los criterios de filtrado y filtros contextuales corresponde a la cláusula WHERE. El criterio de ordenación corresponde a la cláusula ORDER BY. El paginador agrega cláusulas LIMIT y OFFSET. Usar agregación añade una cláusula GROUP BY a la consulta. Y la opción “Único(s)” de las opciones de consulta añade una cláusula DISTINCT. Toma en cuenta que los elementos de la interfaz no se mapean uno a uno a elementos de la consulta SQL. La interfaz Views UI procura ocultar la complejidad de la estructura de base de datos a los constructores de sitios. Aunque no es requerido, entender este mapeo es útil, especialmente cuando la configuración de la vista no produce los resultados esperados.
Resultados dinámicos
Vistas es uno de los múltiples sistemas que permiten crear sitios dinámicos con Drupal. Estos sitios, una vez configurados, actualizan su contenido automáticamente a medida que el tiempo pasa. Por ejemplo, si tienes un sitio que contiene información acerca de eventos, puedes querer tener una página que liste únicamente los eventos futuros. Para lograr esto puedes crear un tipo de contenido “Evento” que tenga un campo “fecha”. Luego, puedes crear una vista que usa este campo de modo que sólo eventos cuya fecha sea “hoy” o mayor aparezcan en la lista final. Nota que es posible diferenciales de fechas (en inglés) como valores de filtrado. Una vez la configuración está lista, los editores de contenido sólo deben agregar nodos y establecer el valor del campo “fecha”. Cuando Drupal muestra la página de esta vista, va a respetar la configuración y sólo mostrará resultados que cumplen la condición de hoy en adelante. Esto muestra la necesidad de almacenar datos de nodos en campos separados. De esta manera puedes usarlos como campos (a mostrar), criterios de filtrado, criterio de ordenación y más. Si hubieras almacenado esta información en el campo “cuerpo” sería prácticamente imposible usarla para cualquiera de esos propósitos.
Vistas con un sólo resultado
Al inicio dijimos que las vistas se usan para crear listados de elementos. Cuando hablamos de listas, es normal pensar en resultados con dos o más elementos, usualmente muchos. Pero hay algunos casos donde crear una vista que produzca un elemento hace sentido: cuando quieres mostrar “lo más de”, “el mejor de” u otros superlativos. Por ejemplo, el artículo más visitado el mes pasado, el evento más concurrido el año pasado, el producto más reciente agregado a la tienda, etc. Otro caso de uso para una vista de un elemento es cuando quieres mostrar algo aleatorio. Para lograr esto, agrega un único criterio de filtrado llamado apropiadamente “aleatorio”. En todos estos casos el paginador se configuraría para mostrar un único elemento.
Otros casos de uso
Los casos de uso para Vistas son interminables. Algunos van a requerir el uso de módulos contribuidos, pero es posible construir muchas cosas usando funcionalidad base de Views. Acá se muestra una pequeña lista de cosas que puedes construir con Vistas:
- Un mapa interactivo como el que se muestra en Drupical.com.
- Una representación JSON o CSV de algún contenido que quieras migrar de Drupal 8 a Drupal 8 usando el API de Migraciones (Migrate API).
- Una página de búsqueda con filtros expuestos y facetas usando el API de Búsqueda (Search API).
- Un reproductor de audio o video con la funcionalidad de lista de reproducción.
- Un carrusel de imágenes, aunque es es probablemente una terrible idea.
El poder es tuyo
Vistas es un sistema extremadamente poderoso y un diferenciador clave entre Drupal y otros sistemas gestores de contenidos (CMS) y frameworks. En este artículo apenas hemos tocado la superficie de lo que es posible. Vistas incluye otros conceptos cómo filtros contextuales y relaciones que no se explicaron. Usando módulos contribuidos o código personalizado puedes ajustar el sistema de Vistas a tus necesidades particulares. Por ejemplo, puedes extender Vistas usando plugins para crear tus propios campos, criterios de filtrado, criterios de ordenamiento, etc. También puedes usar hooks para alterar la consulta SQL. Adicionalmente, puedes reescribir los resultados y personalizar el HTML que se produce. Con tantas partes, puede ser intimidante aprender Vistas. Mi recomendación es aprender un concepto a la vez y jugar con las vistas existentes, como las que vienen en el núcleo de Drupal, para aprender cómo funcionan.
Hace aproximadamente 8 años, Johan Falk creí uno de los mejores recursos de aprendizaje sobre Vistas que he conocido hasta ahora. Como los conceptos de Drupal que hemos aprendido hasta ahora, los conceptos de Vistas no han cambiado significativamente desde que se publicó esa serie de videos. Muchas gracias a Johan por crear tantos valiosos tutoriales de Drupal en aquellos tiempos. Tal vez en el futuro yo pueda producir un tutorial sobre vistas similar/actualizado aquí en UnderstandDrupal.com Ponte en contacto conmigo si te estarías interesado en patrocinar dicho proyecto.
¿Qué tan familiarizado estabas con las Vistas en Drupal? ¿Sabías cómo diferentes elementos de la interfaz de Views UI corresponden a cláusulas de consultas SQL? ¿Cuáles son algunos conceptos que encuentras difícil de comprender? ¿Qué módulos contribuidos conoces que extienden la funcionalidad de Vistas?