Передайте сырой HTML в #markup


24

У меня есть некоторые HTML содержания, это происходит из внешней библиотеки , поэтому я не могу изменить его, он имеет много <span>и <div>тег с атрибутами , такими как: <span style="color: #0000ff;">, но когда я использую:

$render = array(
  '#markup' => $myhtmlcontent,
);

В массиве рендеринга Drupal удаляет атрибуты и сохраняет их <span>без стилей.

Итак, как я могу избежать изменений в Drupal, которые я передаю как разметку, которая не нуждается в каком-либо фильтре, потому что библиотека делает это безопасным или, наконец, разрешает стили?


атрибуты стиля всегда
удаляются

Ответы:


28

Используйте встроенный шаблон:

  return [
    '#type' => 'inline_template',
    '#template' => '{{ somecontent }}',
    '#context' => [
      'somecontent' => $somecontent
    ]
  ];

В вашем случае без контекста, просто прямо HTML.

Вы также можете использовать элемент html_tag для таких вещей, как скрипт или ссылка и так далее.


2
Это отфильтровывает теги IFRAME.
Иоахим

1
И сценарий и теги стиля
Измир Рамирес

8
Попробуйте {{variable | raw}} или <tag> {{variable}} </ tag>

1
@IvanJaros Это просто пропустит автоматическое экранирование variable, но `\ Drupal \ Component \ Utility \ Xss :: filterAdmin ()` будет по-прежнему отфильтровывать теги, такие как <script> и атрибуты стиля. Единственный способ, который я видел до сих пор, - это добавить файл Javascript в качестве библиотеки и добавить «#attached» => «library» => «module_name / library_key_in_yml» к вышеприведенному return. @see drupal.stackexchange.com/questions/211078/…
Измир Рамирес

1
Кто-нибудь знает, если это единственный / лучший способ делать комментарии HTML? например <! - Привет, Мир! -> (примечание: как уже было сказано выше, вам нужно '| raw')
Уильям Туррелл,

18

Как описано в обзоре API рендеринга , в Drupal 8 строка, передаваемая в #markup, передается через \ Drupal \ Component \ Utility \ Xss :: filterAdmin () , которая удаляет известные векторы XSS, в то же время разрешая разрешительный список тегов HTML, которые не являются XSS векторы. Вы можете использовать #allowed_tags, чтобы установить список разрешенных тегов, но это не остановит Drupal от удаления атрибутов (например, стиля).

$output['filtered_string'] = array(
  '#markup' => '<em>This is filtered</em>',
  '#allowed_tags' => ['strong'],
);

Поскольку в вашем случае вы передаете сложную HTML-разметку, вы должны использовать #type (как это было предложено от Ivan Jaros или использовать #theme. В этом случае, #type кажется лучшим решением.

Вы также можете реализовать новый тип с помощью плагина элемента рендеринга, но если это единственный случай, когда он вам нужен, то реализация плагина рендеринга элемента, вероятно, является чрезмерной.


12

Если вы хотите добавить простую разметку для рендеринга массивов, вы можете создать ее, используя \ Drupal \ Core \ Render \ Markup . Это позволит вам вложить во что-то необработанный HTML. Например, вот как он используется в модуле « Отчет о разрешениях » для помещения HTML в таблицы :

$rows[] = [
  [
    'data' => $this->l($meta['title'], new Url('permission_report.permission', ['user_permission' => $perm], $options)),
  ],
  ['data' => $users_having_role],
  ['data' => Markup::create(implode(', ', $display_roles))],
];

3
Я знаю, что это два года спустя, но спасибо. Для начинающих позвольте мне упростить это: use \ Drupal \ Core \ Render \ Markup $ HeaderSettingsIcon = Markup :: create ('<i class = "fa fa-cogs"> </ i>');
Нгатия Франклин

@NgatiaFrankline, есть ли способ выразить вам мою благодарность?
Дреш

Я сделал это: $ form ['first_name'] = array ('#type' => 'textfield', '#title' => t ('Your First Name:'), '#required' => TRUE, '# Атрибуты '=> array (' class '=> array (' req '),' name '=> array (' first_name ')),' #label_attributes '=> array (' class '=> array (' обязательный ')),' #children '=> Markup :: create (' <span class = "error-text"> Пожалуйста, введите правильное имя </ span> '),);
Дреш

12

В массиве рендеринга просто сделайте это:

return [
  '#children' => $html,
];

Например, если он $htmlбыл создан с помощью PHP highlight_string(), он будет содержать атрибуты стиля, которые будут удалены с помощью #markup. Но #childrenсохраняет их.


Да, у меня это сработало. вместо #markup используйте некоторые другие ключевые слова, такие как #scode или #children или #customname
manimjs
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.