Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Creación de extensiones de Twig para personalizar la presentación de campos

Creación de extensiones de Twig para personalizar la presentación de campos

Lightning Talk de la DrupalCamp 2017 sobre creación de extensiones personalizadas de Twig que nos permitan disponer de nuevos filtros. En la presentación se ven ejemplos de filtros que permiten eliminar acentos y caracteres extraños de una cadena, eliminar números o calcular el tiempo de lectura de un texto

Delirium Coder

May 05, 2017
Tweet

More Decks by Delirium Coder

Other Decks in Programming

Transcript

  1. Creación de extensiones de Twig para
    personalizar la presentación de campos
    Víctor Rodríguez Lledó
    #DrupalCampES
    www.deliriumcoder.com

    View Slide

  2. TWIG
    ● Una de las grandes mejoras de Drupal 8
    ● Más seguro
    ● Más potente
    ● Extensible

    View Slide

  3. FACILIDAD PARA FORMATEAR CAMPOS
    ● Twig nos proporciona gran cantidad de filtros que podemos aplicar para
    formatear un campo (date_format, replace, trim, lower, upper...).
    ● Se pueden aplicar de forma consecutiva: el resultado del filtro anterior se aplica
    al siguiente (field | lower | trim)
    ● Filtros disponibles

    View Slide

  4. EXTENSIONES TWIG DEL CORE
    ● Drupal 8 añade multitud de extensiones para facilitarnos el trabajo
    ● Algunos ejemplos: t, trans, clean_id, clean_css
    ● /core/lib/Drupal/Core/Template/TwigExtension.php

    View Slide

  5. EXTENSIONES PERSONALIZADAS
    1. Crear un módulo
    modules
    -- custom
    ---- my_custom_twig_extension
    ------ src
    -------- TwigExtension.php
    ------ my_custom_twig_extension.info.yml
    ------ my_custom_twig_extension.services.yml

    View Slide

  6. EXTENSIONES PERSONALIZADAS
    2. my_custom_twig_extension.info.yml
    name: My custom twig extension
    type: module
    description: Adds a custom twig extension
    core: 8.x

    View Slide

  7. EXTENSIONES PERSONALIZADAS
    3. Definir una clase que herede de Twig_Extension

    View Slide

  8. namespace Drupal\my_custom_twig_extension;
    class TwigExtension extends \Twig_Extension {
    /**
    * Generates a list of all Twig filters that this extension defines.
    */
    public function getFilters() {
    return [
    new \Twig_SimpleFilter('removediacritics', array($this, 'removeDiacritics')),
    ];
    }
    /**
    * Gets a unique identifier for this Twig extension.
    */
    public function getName() {
    return 'my_custom_twig_extension.twig_extension';
    }
    /**
    * Removes string diacritics.
    */
    public static function removeDiacritics($string) {
    return \Drupal::service('transliteration')->removeDiacritics($string);
    }
    }

    View Slide

  9. EXTENSIONES PERSONALIZADAS
    4. my_custom_twig_extension.service.yml
    services:
    my_custom_twig_extension.twig_extension:
    arguments: ['@renderer']
    class: Drupal\my_custom_twig_extension\TwigExtension
    tags:
    - { name: twig.extension }

    View Slide

  10. EXTENSIONES PERSONALIZADAS
    5. Habilitar el módulo my_custom_twig_extension
    6. Limpiar la caché
    7. Y listo para usar {{ field | removediacritics }}

    View Slide

  11. Otros ejemplos
    ● Eliminar los números de una cadena

    View Slide

  12. class RemoveNumbers extends \Twig_Extension {
    /**
    * Generates a list of all Twig filters that this extension defines.
    */
    public function getFilters() {
    return [
    new \Twig_SimpleFilter('removenum', array($this, 'removeNumbers')),
    ];
    }
    /**
    * Gets a unique identifier for this Twig extension.
    */
    public function getName() {
    return 'hello_world.twig_extension';
    }
    /**
    * Replaces all numbers from the string.
    */
    public static function removeNumbers($string) {
    return preg_replace('#[0-9]*#', '', $string);
    }
    }

    View Slide

  13. Otros ejemplos
    ● Calcular el tiempo de lectura de un texto

    View Slide

  14. namespace Drupal\readingtime\TwigExtension;
    use Drupal\Core\Render\Markup;
    class ReadingTimeExtension extends \Twig_Extension {
    public function getFilters() {
    return array(
    'readingtime' => new \Twig_Filter_Function(
    array('Drupal\readingtime\TwigExtension\ReadingTimeExtension', 'readingTimeFilter')
    )
    );
    }
    public function getName() {
    return "readingtime.twig_extension";
    }
    public static function readingTimeFilter($string) {
    if($string instanceof Markup) { // we check if the $string is an instance of Markup Object.
    $striped_markup = strip_tags($string->__toString());
    $wpm = str_word_count($striped_markup)/130; // $wpm = Words Per Minute.
    $reading_time = ceil($wpm); // Round the float number to an integer.
    return $reading_time; // we return an integer with the number of minutes we need to read something.
    } else {
    return $string;
    }
    }
    }

    View Slide

  15. ¡Gracias!
    Thank you!
    #DrupalCampEs
    Víctor Rodríguez Lledó
    @vlledo

    View Slide