Seleccionar view mode por nodo

Llevo mucho tiempo estudiando una funcionalidad de Drupal denominada "view modes", dado el enorme potencial que le veo. Los "view modes" es una característica core de Drupal desde la versión 6, y ofrecen una gran flexibilidad, pero el usuario administrador normal no dispone de acceso a todas sus posibilidades ya que están "escondidas" en algunas funciones del framework.

Básicamente esta característica consiste en poder disponer varias formas de organizar la visualización de los campos de un nodo (o en general de una entidad). Por lo general, son los módulos los que suelen proporcionarnos nuevos modos de vista, pero el usuario no tiene área de gestión para ello. Un módulo que crea un nuevo "view mode" es "Print", en el que podemos organizar como se visualizan los contenidos del nodo a imprimir en su formato de impresión (es decir que un nodo puede tener organizaciones de campos distintas en su página web y en su versión de impresión gracias a los "view modes").

Una vez definidos, los usuarios sí tiene acceso a decidir qué "view modes" están activos y qué campos quiere en cada modo de vista, pero el punto débil del sistema es que no se les permite decidir cuándo utilizar uno u otro modo de vista. Un ejemplo es que el módulo buscador crea su propio "view mode" para los resultados en el buscador, pero no hay forma de usar ese view mode en ningún otro sitio. El único módulo que permite decidir el view mode a usar es "Views" en el modo de renderizar nodos completos. En general prefiro usar Views en modo de campos, ya que Views en sí mismo ya me permite distribuir los campos como me interese.

Alguien podría preguntarse, ¿bueno, y que tiene esto de tan fantástico? Pues se me ocurren varios escenarios de aplicación:

  • en una web muy gráfica organizar la visualización de los campos a gusto del maquetador con distintos view modes en cada nodo
  • cuando se ve la web desde un móvil se usa un view mode específico para móviles con una organización de campos propia, y un CSS apropiado
  • según roles se puede ver un nodo de una forma o de otra, no solo con los permisos de los campos, también con organización de campos distinta (imaginemos un CRM con roles distintos)
  • en una web puede haber un modo "premium" de visualización (quizá por pago) que oculta ciertos campos si el usuario no tiene al día su cuota de pago
  • quizá podriamos tener un view mode distinto para navegadores distintos o para navegadores antiguos

El módulo Viewmode per Node

Para mejorar esta situación acabo de publicar en mi sandbox de Drupal el módulo "Viewmode per Node". Este módulo solventa el primero de los escanarios anteriores ofreciendo la posibilidad de seleccionar dentro del formulario de cada nodo el modo de visualización para mostrar su contenido.

Pero, ¿qué escenarios pueden ser útiles para cubrir con este módulo? Imaginemos que los editores en algunos sitios web les gustaría decidir distintas organizaciones de nodo, en algunos casos, la imagen principal sería el primer elemento, en otros nodos primero iría un vídeo, en otros alguna lista de contenido relacionado estaría en la parte superior, en otros la entradilla y los tags. Con "Viewmode per Node" podrían crear varios "view modes", organizar los campos en cada uno de la forma que mejor convenga y seleccionar posteriormente en cada nodo de forma individual el "view mode" necesario para tener en la parte superior el elemento más interesante.

Este módulo requiere tener el sistema preparado con ciertas cosas:

  1. Drupal 7.17 o superior. Este módulo se basa en "hook_entity_view_mode_alter ()", que apareció en esa actualización. Mejora tu Drupal a la última versión disponible, ya que es una buena estrategia para estar libre de errores y con la versión más segura de código.
  2. "Entity view modes", que es la mejor herramienta para la creación y gestión de nuevos "view modes", para los nodos y para cualquier otra entidad.

En el siguiente pantallazo vemos como se puede acceder a la lista de view modes dentro de los "tabs" de edición del formulario de cada nodo.

Crear nuevos "view modes"

El punto que este módulo no solventa es la creación de nuevos modos de vista. Esta característica está muy bien cubierta por "Entity view modes", que de hecho es un dependencia (sin éste módulo aquel no podrá ser activado). Algún elemento debe proporcionarnos la posibilidad de crear nuevos view modes y este módulo lo hace muy bien, con un conjunto de características muy interesante, un interface muy claro (su UI cubre muy bien los estándares de Drupal), viene avalado por un miembro experto y con prestigio en la comunidad Drupal, e indica que ha sido instalado en un número bastante alto de sites. Existe un módulo anterior a este y muy parecido para Drupal 6 llamado "Build modes".

Tras crear los nuevos view modes (que por el momento no son más que nombres en una lista) debemos desplazarnos a la página de ajustes del modo de visualización del tipo de contenido que queremos extender. En el siguiente pantallazo vemos como aparecen en el bloque inferior "Opciones de presentación personalizada", que es el lugar donde habitualmente se activan o desactivan los view modes que ese tipo de contenido puede usar. En la parte superior vemos marcado con un borde rojo los nuevos tipos de view modes que se han creado en el pantallazo anterior. Al clicar en el siguiente pantallazo en cada view mode podremos ajustar los campos en el orden, organización y configuración individual que más nos convenga.

Pero una de las cosas que me gusta mucho de "Entity view modes" es su muy bajo tamaño, lo que sumado al también pequeño tamaño de "Viewmode per Node" significa una alternativa muy interesante a "Display Suite", otra solución para resolver lo que este módulo propone pero con una uso de memoria muy grande (ver más abajo).

Si la memoria en tu sitio web Drupal es un problema (y puede serlo en Drupal 7 si la web se aloja en servidores compartidos pequeños con poca memoria Ram disponible para PHP), quizá porque ya estás usando muchos módulos, tal vez puedas eliminar la dependencia a "Entity view modes" en el archivo .info de este nuevo módulo, antes de instalar y agregar al final del archivo .module la siguiente función:

/**
* Implements hook_entity_info_alter().
*/
function viewmode_per_node_entity_info_alter(&$entity_info) {
  $entity_info['node']['view modes']['special_display'] = array(
    'label' => t('Special display'),
    'custom settings' => TRUE,
  );
}

Esta es la forma de añadir un nuevo modo de vista a través de programación en Drupal, ¡así de fácil! Para agregar nuevos "view modes" hay que ir a esa función y añadir un nuevo elemento a la matriz (y recuerda limpiar la caché después porque sinó no te saldrán a la vista).

Alternativas

Este no es el único módulo que hay para explotar la funcionalidad de los view modes del sistema 7 de Drupal, otros módulos se enfocan en diferentes direcciones:

  • Sólo hay una alternativa a este módulo "Display Suite" utilizando el módulo de "Extras", pero esto significa que la carga de la memoria del sistema con grandes módulos que pueden ser un problema en algunos hostings compartidos. Te da un montón de características que tal vez no estás interesado en usar (o tal vez sí) y te harán tu sistema de configuración muy complicado.
  • "View Mode Page" construye una URL en cada nodo en el que hace que ese nodo se pueda visualizar en cada "view mode" que está activo para ese tipo de nodo.
  • "View Mode Modal" hace que podamos abrir ese tipo de nodo en ventanas modales de CTools elijiendo en qué view mode.
  • "Entity reference plus data" permite seleccionar el modo de visualización de un campo de referencia de nodo en el momento de seleccionar la referencia en el formulario de edición del nodo, puede ser útil para evitarse rehacer cada node reference con otras herramientas más complejas.
  • Con "Contextual View Modes" es incluso posible ir un paso más allá: se puede seleccionar dentro de cada nodo el "view mode" en que desee verlo renderizado en función del "context" que esté activo. Soy un gran fan del módulo "Context" como herramienta para organizar secciones, lo uso en todos los proyectos, y esta característica es una gran herramienta en muchas situaciones (como puede leer en otra entrada del blog). El problema es que depende de "Display Suite", y sería genial que fuera capaz de trabajar también con "Entity view mode" como definidor de nuevos modelos de modo de vista de nodo. Es posible definir dentro de cada nodo varias condiciones basadas en distintos contextos (y por tanto distintas condiciones), con lo que las posibilidades son enormes.

Conclusiones

Como hemos visto estas opciones de gestión de la visualización de los contenidos ajustando diversos perfiles es realmente algo muy flexible y potente. El próximo Drupal 8 evoluciona aún más en este sentido integrando una solución parecida al comentado módulo "Entity view modes" dentro del mismo core del sistema. En este vídeo en inglés se da un repaso a esta funcionalidad de Drupal 8.

En Innodus vamos a seguir apostando por profundizar en los view modes, buscando más soluciones que amplien el potencial de programar cómo decidir en qué situación se muestra un nodo en un "view mode" o en otro, especialmente viendo que Drupal 8 se extiende en esta dirección. Os animamos a probar nuestro nuevo módulo "Viewmode per Node" y a darnos vuestras impresiones en los comentarios o en la lista de issues del módulo.