Por qué mis template suggestions no funcionan?

3 minutos

Alguna vez me paso que cuando cree una suggestion para un campo de Drupal este no funcionaba, intente algunas cosas y limpie cache varias veces, pero nada, hasta que encontré la respuesta en la documentación de Drupal.

Primero hablemos un poco de que se tratan estas cosas.

¿Qué son las template suggestions?

Las "template suggestions" son una forma de personalizar la apariencia de los elementos de contenido. Por defecto Drupal ya provee varias que puedes usar, estas siguen un patrón el cual puedes encontrar en https://www.drupal.org/node/2354645.

Puedes crear diferentes versiones de un template en Drupal para que se apliquen según ciertos criterios, por ejemplo podrías hacer una para los nodos que solo funcione cuando un campo tenga un valor específico.

¿Cómo se crean las template suggestions?

Para crear "template suggestions", necesitas conocer el sistema de nomenclatura utilizado por Drupal. Por lo general, es algo como node--type.tpl.php, donde type representa el nombre del tipo de contenido y node indica el tipo de entidad.

Usando el hook_theme_suggestions_HOOK_alter puedes definir nuevas templates que te permitan personalizar la presentación de tu sitio, el siguiente sería un ejemplo con el tipo de entidad nodo:

function MYMODULE_theme_suggestions_node_alter(array &$suggestions, array $variables) {
  if (\Drupal::currentUser()
    ->isAuthenticated()) {
    $suggestions[] = 'node__logged_in';
  }
}

El código anterior funciona de la siguiente manera:

  • En la primera parte hook representa el nombre del módulo o tema desde donde se implementa.
  • El siguiente HOOK que está en mayúscula se refiere normalmente al tipo de entidad que va a ser renderizada, esta puede ser node, user, form_element, etc.
  • Todos los elementos agregados al arreglo $suggestions serán las template suggestions que pueden ser agregadas a tu tema para personalizar la presentación bajo ciertas condiciones, en este caso se agrega una que indica que el usuario es autenticado, pero en realidad podrías crear condiciones más complejas, ya que dentro de $variables viene también la entidad con todos sus datos.

¿Cómo descubrir cuáles templates están disponibles?

Como te explique, Drupal ya ofrece muchos templates que puedes usar, para descubrirlos solo tienes que agregar las siguientes líneas al archivo sites/development.services.yml, y después limpiar cache.

parameters:
  twig.config:
    debug: true 

Asegúrate también de que las siguientes líneas no estén comentadas en el archivo sites/default/settings.php

if (file_exists($app_root . '/' . $site_path . '/settings.local.php')) {
  include $app_root . '/' . $site_path . '/settings.local.php';
}

Una vez hecho eso, cuando vas a cualquier página del sitio e inspecciones su código fuente, podrás ver algunos comentarios indicando los templates disponibles.

Y ahora sí, porque parece que Drupal no reconoce mis templates.

En el código de PHP las template suggestions se definen con guiones bajos _, pero al momento de crear los archivos debes reemplazarlos por guiones al medio -, aquí algunos ejemplos:

  • node__logged_in -> node--logged-in.html.tpl
  • field__user_badges -> field--user-badges.html.tpl

  • page__user__view -> page--user--view.html.tpl

Espero que esta aclaración te ahorre algunos dolores de cabeza.

 

Jidrone Drupal Developer
J. Ivan Duarte
Drupal Senior Developer

Share