Ampliando las extensiones (Filtros y Funciones) de Twig en Drupal 8

Una de las nuevas características de Drupal 8 es que utiliza el poder del motor de plantilla de Symfony: Twig, lo que hace más limpio el código que el motor de plantilla PHP Template usado en Drupal 7. Teniendo esto en cuenta, Drupal 8 por defecto incluye un grupo de extensiones disponibles pasa usar en las plantillas como por ejemplo, los filtros upper que transforma a mayúscula el texto pasado y lower que lo transforma a minúscula.
Por otro lado, existe un grupo de funciones que nos ayudan en la lógica de la vista, como url() que permite generar una URL absoluta dado el nombre de ruta y los parámetros, o la función file_url() que acepta un URI para un archivo y crea una ruta URL relativa a este.
Ejemplo de usos:
{{ “Drupal 8 is awesome”| upper }} // Filter upper. La salida sería DRUPAL 8 IS AWESOME
{{ link(item.title, item.uri, { 'class':['foo', 'bar', 'baz']} ) }} // Function link()

Aquí encontrarás un listado de algunos filtros y funciones disponibles.
Al trabajar en una migración de Drupal 7 a Drupal 8 me topé con la necesidad de hacer algunas extensiones personalizadas, como por ejemplo formatear un número como una cadena de moneda por medio de la función php money_format() siendo un ejemplo de salida 150.000€, o simplemente dando un número telefónico hacerle un formato de salida.
En nuestro post vamos a hacer un filtro que aplica un formato de dinero y una función que devuelve texto de prueba Lorem ipsum con un color pasado por parámetro, dos ejemplos sencillos que van a servir de muestra para la creación de extensiones personalizadas.
Lo primero sería en un custom module que hayas creado.
- Crear el fichero servicios con el nombre my_module.services.yml con la siguiente estructura.
services:
my_module.twig.extension:
class: Drupal\my_module\TwigExtension\my_moduleTwigExtension
tags:
- { name: twig.extension }
- Creamos el fichero php my_moduleTwigExtension.php en la ruta my_module/src/TwigExtension/my_moduleTwigExtension.php en el cual declararemos la clase my_moduleTwigExtension que extenderá de la clase Twig_Extension.
namespace Drupal\my_module\TwigExtension; class my_moduleTwigExtension extends \Twig_Extension { /** * Devuelve una lista de todos las funciones que se han definido. * En Twig_SimpleFunction() se le pasa por parámetros el nombre por el cual será llamada la función desde la plantilla * y como segundo parámetro la función que la implementa. */ public function getFunctions() { return [ new \Twig_SimpleFunction('text_test', [$this, 'textTest']), ]; } /*** * Devuelve una lista de todos los filtros que se han definido. * En Twig_SimpleFilter() se le pasa por parámetros el nombre por el cual será llamado el filtro desde la plantilla * y como segundo parámetro la función que implementa el filtro. */ public function getFilters() { return [ new \Twig_SimpleFilter('money_format', [$this, 'moneyFormat']), ]; } /** * Devuelve el nombre de la extensión */ public function getName() { return 'my_module.twig.extension'; } // Funcion que devuelve un texto de ejemplo con un color pasado por parametro. public function textTest($color = "black") { return '<span style="color: ' . $color . '">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quos quidem tibi studiose et diligenter tractandos magnopere censeo.</span>'; } //Filtro que aplica un formato de dinero public function moneyFormat($string) { setlocale(LC_MONETARY, 'en_US.UTF-8'); return money_format('%i', $string); } }
- Y por último limpiamos la caché y ya podemos hacer uso del filtro y la función creada.
{{ text_test('red') | raw }}
{{ '150' | money_format }}
Para más información y ejemplos puedes consultarlos aquí-
Maikel Maldonado