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

03/09/2019
coding 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()

coding drupal 8


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