Визуализация простого текста в виде HTML в ветке Drupal 8

16

Я наткнулся на стену, пытаясь отрисовать код разметки SVG-изображения в HTML из простого текстового поля.

Я пытаюсь сделать svg-код из простого текстового поля, не переопределяя отображение текстового поля везде.

простой текстовый формат в настоящее время преобразует все HTML-теги и <> в &lt; &gt;.

Я создал шаблон поля и попытался вывести содержимое поля как

{{ item.content.context.value }}

и

{{ item.content|raw }}

оба отображают значение в виде строки, заключая каждую строку в «кавычки» и преобразуя разрывы строк в <br/>теги.

Раньше у меня был форматированный текст типа поля, но он также оборачивал все в <pre>теги, даже когда все теги были разрешены. Я бы очень хотел, чтобы это работало с простым текстом.

Пример svg-кода, который поле должно содержать в текстовом виде:

<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
         viewBox="0 0 290 290" enable-background="new 0 0 290 290" xml:space="preserve">
    <g>
        <path fill="none" stroke="#78C681" stroke-width="3" stroke-miterlimit="10" d="M261.1,273.1H28.9c-6.6,0-12-5.4-12-12V28.9
            c0-6.6,5.4-12,12-12h232.1c6.6,0,12,5.4,12,12v232.1C273.1,267.7,267.7,273.1,261.1,273.1z"/>
        <circle fill="none" stroke="#1B435D" stroke-width="2" stroke-miterlimit="10" cx="145.2" cy="166.9" r="62.7"/>
        <line fill="none" stroke="#78C681" stroke-width="3" stroke-miterlimit="10" x1="16.9" y1="60.8" x2="273.1" y2="60.8"/>
        <circle fill="none" stroke="#1B435D" stroke-width="2" stroke-miterlimit="10" cx="178.3" cy="152.3" r="6.8"/>
        <path fill="none" stroke="#1B435D" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" d="M115.1,167.9
            c8.8,0,22.3,3.2,28.4,4.7"/>
        <path fill="none" stroke="#1B435D" stroke-width="2" stroke-linecap="round" stroke-miterlimit="10" d="M151.9,216.9
            c0,0,17.2-1.5,29.6-14.8"/>
    </g>
</svg>

Надеюсь, кто-то может помочь.

Лучший,

Alari

Алари Труутс
источник
Из простого текста есть фильтр, который избегает разметки. |rawне покидает уже сбежавшую разметку. Побег происходит раньше, чем автоматический побег Твига.
Котцер

Ответы:

17

Решение от iworkyon из сообщества Drupal:

поле - узел - [имя поля] .html.twig:

{% if svg %}
  <div class="my-svg">
    {{ svg|raw }}
  </div>
{% endif %}

THEME.info:

/**
* Implements hook_preprocess_field().
*/
function MYTHEME_preprocess_field(&$variables, $hook) {
    switch ($variables['element']['#field_name']) {
      case 'field_svg_test':
        $variables['svg'] = $variables['items'][0]['content']['#context']['value'];
        break;
    }
}
Алари Труутс
источник
Хе-хе, похоже, что мое прозвище "Я на работе" проникло сюда: D Забавное открытие во время поиска в Google!
ividyon
Надеюсь, ты не возражаешь :) Это помогло мне, поэтому я решил поделиться.
Алари Труутс
7

Вы пытались применить необработанный фильтр к значению?

{{ item.content.context.value|raw }}

Но это не безопасно. Для вывода файлов вы можете использовать файловое поле. Здесь есть правильные средства форматирования полей для генерации ссылки. Если вы не можете настроить ссылку в пользовательском интерфейсе для своих нужд, вы можете изменить веточку или предварительную обработку для этого конкретного поля.

4k4
источник
rawнаходится / был удален: drupal.org/node/2603074
Клайв
4k4: поле представляет собой текстовое поле, а не файл. Значением поля будет скопированная разметка изображения SVG. Я попробовал ваше решение, но ничего не изменилось, все равно получаю проблему с кавычками и переводом строки. Кроме того, теперь я беспокоюсь об использовании | raw после того, что сказал Клайв, и еще дальше от решения проблемы.
Алари Труутс
Вы еще дальше от достижения решения, потому что вы пытаетесь обмануть auto escaping und drupal пытается все, чтобы отговорить вас от этого. Лучше использовать механизм для предоставления ссылок на файлы, как описано в моем ответе. А затем используйте соответствующие шаблоны веток вниз по линии, чтобы изменить рендеринг.
4k4
4k4: Я немного запутался, поскольку содержимое, которое должно содержать поле, не является файлом. это в виде текстового / SVG-кода. Я обновил вопрос с примером.
Алари Труутс
Обычный текст не сможет выводить этот код SVG. Вы пробовали текстовый формат "Full Html", если это может обработать svg-код? Если нет, то лучше поместить svg в собственный svg-файл.
4k4
6

Это сработало для меня:

{{ item.content['#context'].value|raw }}
Джейни
источник