почему переменные шаблона Twig с разметкой не отображаются?

8

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

$test = "<p>this is a paragraph</p>";

и я передаю его в мой шаблон:

$variables['test'] = $test;

и выведите его в веточку:

{{test}}

но вместо того, чтобы получить отформатированный абзац, я получаю исходный вывод в виде простого текста:

<p>this is a paragraph</p>

Как мне заставить Drupal отобразить это как обычный HTML?

RominRonin
источник

Ответы:

14

Потому что веточка автоматически экранирует небезопасный контент, и ваш контент не помечен как безопасный.

Вы можете явно сказать ему, что это с $test = Markup::create($test); но вы должны быть очень осторожны с этим. Если он содержит какой-либо пользовательский ввод, вы можете открыть себя для проблем XSS.

Более эффективные подходы - использовать рендер-массив, например ['#markup' => 'your text'], который по умолчанию допускает определенное количество тегов html, но не все из них. Вы также можете использовать встроенный шаблон, как описано здесь: https://www.drupal.org/node/2311123 .

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

Berdir
источник
2
Я обнаружил, что с помощью необработанного фильтра я получаю нужный вывод, поэтому: {{test | raw}} выдает 'this is абзац' без разметки.
RominRonin
1
хорошо, так что raw небезопасен, и я не понимаю, как мне использовать пример документации, которую вы предоставили
RominRonin
1
Хорошо, с помощью некоторых #drupal IRC-бездельников я нашел это: drupal.org/node/2296163, который содержит несколько опций для вывода разметки в веточку.
RominRonin
1
В моем примере я получил $ test из запроса базы данных, и данные поля были сохранены с разметкой (базовое поле html ckeditor), поэтому метод #markup был наиболее подходящим для этого варианта использования.
RominRonin
12

Это две возможности обернуть $ test в абзац и передать его в шаблон веточки:

$variables['test'] = [
  '#markup' => $test,
  '#prefix' => '<p>',
  '#suffix' => '</p>',
];

$variables['test'] = [
  '#type' => 'inline_template',
  '#template' => '<p>{{ text }}</p>',
  '#context' => [
    'text' => $test,
  ],
];
4k4
источник