Twig: Enlaces con HTML y variables.

Una de las principales novedades que trae Drupal 8 es el motor de plantillas Twig, porque su forma de trabajar dista mucho de lo que hacíamos con Drupal 7.

En un primer momento, uno va a la documentación de Twig y ahí está todo -o casi todo-, para empezar a trabajar, pero, como sabemos, es en el día a día donde te encuentras con los problemas reales que hay que solventar.

En este caso, la cuestión es cómo añadir un enlace en Twig con la función link($text, $url, $attributes) que nos ofrece el core de Drupal. Como se intuye nada más verla, necesita el texto del enlace y la url, que puede ser un objeto del tipo Url o, simplemente, una cadena de texto con la dirección. En Twig podemos usar objetos que se pueden convertir “mágicamente” en cadenas de texto mediante __toString().

¿Y qué sucede si necesitamos que el texto contenga HTML? ¿Y HTML más una variable? Y la respuesta es que no podemos poner directamente el código en la llamada a la función. Deberemos definir una variable que contenga el código que queremos que aparezca dentro del enlace. Algo así:

 

{% set text %}
 <img src="/{{ directory }}/images/{{ icon }}.svg" alt="Alternative text">
{{ title }} <span class="caret"></span>
{% endset %}
{{ link(text, url, {'class': ['class__link']}) }}

 

Es interesante destacar que en esta función podemos poner directamente como valor para la url una dirección de Drupal. Por ejemplo:

 

{{ link(text, 'internal:/user/login', {'class': ['class__link']}) }}

 

Para ello hay que utilizar las claves “internal:” o “base:”, que son parte del esquema del objeto Url. La primera la usaremos para paths que corresponden a rutas de Drupal y, la segunda, debería usarse para direcciones que no necesitan el sistema de rutas, como archivos estáticos.

Por otro lado, si lo que queremos es que el enlace nos lleve a la home, utilizaremos sólo “base:”, ya que representa el Drupal base path y si necesitamos la dirección de la página en la que estamos, “internal:”.

 

 

Sin llegar a reinventar la rueda, no olvidemos que también podemos fabricar nuestras propias funciones para trabajar con Twig (Un ejemplo de función y filtro).

Como casi todo en Drupal, manejarlo con soltura lleva su tiempo, pero Twig es una de las grandes mejoras de la versión 8 y comprobaremos que ha sido una buena elección a medida que lo vayamos conociendo.