Как вывести HTML-код из длинного текстового поля в Twig?


Какова альтернатива фильтру |raw, если я хочу вывести html из поля сущности в twig в Drupal 8?

В соответствии с этим билетом, |raw следует избегать, но я не могу понять, как использовать то, что они рекомендуют в этом билете (Safestring/safemarkup) в twig.

У меня есть пользовательский объект контента, который имеет следующее определение поля:

$fields['internal_description'] = BaseFieldDefinition::create('text_long')
  ->setLabel(t('Internal description'))
  ->setSettings(array(
    'max_length' => 1500,
  ))

В поле хранится HTML-код из экземпляра CKEditor. Теперь я хотел бы вывести это как HTML в шаблоне ветки. В настоящее время, если я просто позвоню

{{  event.getExternalDescription }}

Я получаю экранированный HTML, как и ожидалось, однако это не то, что я хочу. Если я это сделаю

{{  event.getExternalDescription | raw }}

Я получаю то, что хочу, то есть неэкранированный, визуализированный HTML. Однако, поскольку в этом случае он никоим образом не проверен, я хотел бы знать, как сделать этот вывод безопасным и при этом разрешить моим пользователям использовать CKEditor для ввода контента?

Author: kiamlaluno, 2016-12-27

2 answers

Обычно вы настраиваете отображение поля в пользовательском интерфейсе.

Вы можете сделать это в коде, используя элемент визуализации processed_text.

PHP

  $build = [
    '#type' => 'processed_text',
    '#text' => '<p>Hello world</p>',
    '#format' => 'full_html',
  ];

ВЕТОЧКА

В twig вы бы использовали вместо крайне небезопасного {{ event.getExternalDescription | raw }} этот код:

  {% set build = {
    '#type':   'processed_text',
    '#text':    event.getExternalDescription,
    '#format': 'full_html',
  } %}

  {{ build }}

Безопасность текстового формата зависит от конфигурации текстовых фильтров и содержимого поля. Примените те же соображения безопасности, что и для текстовых форматов в ckeditor.

 5
Author: 4k4, 2020-09-18 06:35:55

Этот тип использования сработал для меня, когда я визуализировал длинное текстовое поле wysiwyg, которое находилось в сущности абзаца на узле:

{{ item.entity.field_innerfieldname.value|t() }}

В частности, в узлах, где field_paragraph_items - это набор элементов абзаца:

{% for item in content['#node'].field_paragraph_items %}

Потребовалось некоторое время, чтобы понять это. процессор twig/t() широко не рекламируется.

См. также:

 1
Author: HongPong, 2018-06-13 16:14:42