Запретить экранирование вывода в расширении функции Twig

Я создал расширение Twig:

{{ image ("image.png", 200) }}

Привет, я знаю, что могу просто сделать

{{ image ("image.png", 200)|raw }}

... но я бы предпочел использовать PHP-код, чтобы все (из этого расширения «изображение») не экранировалось.

Я не думаю, что это возможно.

Я знаю, что могу предотвратить экранирование всего вывода в Twig, но я просто хочу, чтобы это одно расширение не экранировало вывод, а все остальное - для этого.


person user2143356    schedule 31.03.2013    source источник


Ответы (4)


Это можно сделать, добавив параметр при регистрации расширения.

public function getFilters(){
    return array(
        // ...
        'image' => new \Twig_Filter_Method($this, 'imageFilter',
            array('is_safe' => array('html'))
        ),
        // ...
    );
}

Это предоставит неэкранированный входной HTML-код и вернет неэкранированный HTML-вывод. Если вам нужно работать с экранированным вводом HTML, см. Параметр 'pre_escaped' => 'html'.

person Hugo Dozois    schedule 31.03.2013
comment
ПРИМЕЧАНИЕ! Вы можете использовать только pre_escape для фильтров, а OP специально использует функцию, где pre_escape имеет нет эффекта. Вам необходимо вручную экранировать входные данные функций. - person Brian; 23.01.2015

Для расширения функции ветки сделайте это

public function getFunctions()
{
  return array(
     new \Twig_SimpleFunction(
        'image', 
        array($this, 'image'), 
        array('is_safe' => array('html')))
  );
}
person Saman    schedule 16.10.2014

В twig версии 2 вы можете решить это так:

среда: Symfony 4 и twig-bundle ^ 4.0

код:

public function getFilters(): array
{
    return [,
        new TwigFilter('image', [$this, 'image'], ['is_safe' => ['html']]),
    ];
}
person shades3002    schedule 04.12.2018

Я использую функцию

$twig->addFunction(new \Twig_SimpleFunction('html', function ($code) {
   return new \Twig_Markup($code, "utf-8");
}));
{{ html(myhtmlcode) }}
person William Desportes    schedule 21.05.2018