Расширение Twig в Drupal 8. Пишем свои фильтры

Одним из лучших изменений еще один дополнительный гемморой на задницу, реализованных в Drupal 8 стало применение шаблонного движка Twig. Наконец-то пиОнеры разработчики перестануть совать функции, запросы к БД и вообще любой php код в шаблоны и наступит мир и порядок. Вместе с бочкой меда изредка появляется необходимость расширения возможностей шаблонизатора.

Для примера реализуем фильтр, окрашивающий текст в нужный цвет, для этого напишем модуль, расширяющий фильтры в шаблонизаторе twig. Назовем его ColorText, итак создаем в корне сайта в папке modules/custom каталог ColorText и кладем туда по обычаю два файла конфигов, первый описывает info файла, с помощью второго подключим наш класс наследующий расширение шаблонизатора. Файлы называются соответственно ColorText.info.yml и ColorText.services.yml и содержат код:

# ColorText.info.yml
name: ColorText
type: module
description: 'Color text twig filter'
core: 8.x
version: '8.x-1.0'

и

# ColorText.services.yml
services:
  ColorText.twig_extension:
    class: Drupal\ColorText\TwigExtension\ColorTextExtension
    tags:
      - { name: twig.extension }

Теперь в соответствии с определением в конфиге сервиса ColorText.services.yml создадим внутри папки ColorText каталог src в нем каталог TwigExtension и затем наш файлик класса ColorTextExtension.php Полностью весь путь будет таким modules\custom\ColorText\src\TwigExtension\ColorTextExtension.php

В классе не забываем наследовать класс \Twig_Extension, определяем функцию, возвращающую имя фильтра, описанного в конфиге выше и добавляем функцию getFilters, которая возвращает список фильтров и функцию самого фильтра или нескольких фильтров, описанных в getFilters. В целом код класса выглядит так:

<?php
namespace Drupal\ColorText\TwigExtension;

/**
 * Class DefaultService.
 * @package Drupal\ColorText
 */
class ColorTextExtension extends \Twig_Extension {

 
/**
   * {@inheritdoc}
   * This function must return the name of the extension. It must be unique.
   */
 
public function getName() {
    return
'ColorText.twig_extension';
  }

 
/**
   * Generates a list of all Twig filters that this extension defines.
   */
 
public function getFilters() {
    return [
      new \
Twig_SimpleFilter('colortext', [$this, 'filterColorText'], ['is_safe' => ['html']]),
      new \
Twig_SimpleFilter('currency', array($this, 'currencyCalcFilter')),
    ];
  }

 
/**
   * Filter to return colorized text
   */
 
public function filterColorText($txt, $color) {
    return
'<span style="color: ' . $color . ';">' . $txt . '</span>';
  }

 
/**
   * Use Google Currency Converter API.
   *
   * @param int $amount
   *    Amount.
   * @param string $curr_from
   *    From currency.
   * @param string $curr_to
   *    To currency.
   *
   * @return mixed
   *    API response.
   */
 
public function currencyCalcFilter($amount, $curr_from = 'USD', $curr_to = 'EUR') {
   
$url = "http://www.google.com/finance/converter?a={$amount}&from={$curr_from}&to={$curr_to}";
   
$request = curl_init();
   
$timeOut = 100;
   
curl_setopt($request, CURLOPT_URL, $url);
   
curl_setopt($request, CURLOPT_RETURNTRANSFER, 1);
   
curl_setopt($request, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");
   
curl_setopt($request, CURLOPT_CONNECTTIMEOUT, $timeOut);
   
$response = curl_exec($request);
   
curl_close($request);
   
preg_match("/<div id=currency_converter_result>(.*)<span class=bld>(.*)<\/span>/", $response, $converted);
   
$output = array(
     
'#type' => 'markup',
     
'#markup' => sprintf("<div>%s</div>", implode('', [$converted[1], $converted[2]])),
    );
    return
$output;
  }

}
?>

UPD: В классе для примера добавлен второй фильтр конвертации валют.

В принципе это все, теперь можно включать модуль и использовать новый фильтр в шаблонизаторе следующим образом:

{* Twig template *}
{{ 'Some text'|colortext('blue') }}
{{ 'Some text2'|colortext('#f8f8f8') }}

{{ '1500'|currency() }}

Вывод блока с помощью фильтра https://www.openaccess.fr/la-veille-du-web/create-twig-extension-drupal-8
Дока по twig: http://twig.sensiolabs.org/doc/advanced.html

Share this post

Leave a comment

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • To post pieces of code, surround them with <code>...</code> tags. For PHP code, you can use <?php ... ?>, which will also colour it based on syntax.
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.