Как вывести 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 для ввода контента?
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.
Этот тип использования сработал для меня, когда я визуализировал длинное текстовое поле wysiwyg, которое находилось в сущности абзаца на узле:
{{ item.entity.field_innerfieldname.value|t() }}
В частности, в узлах, где field_paragraph_items - это набор элементов абзаца:
{% for item in content['#node'].field_paragraph_items %}
Потребовалось некоторое время, чтобы понять это. процессор twig/t() широко не рекламируется.
См. также: