Передайте сирий 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
Спробуйте {{змінна | raw}} або <tag> {{змінний}} </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? наприклад <! - Привіт, світ! -> (nb: як було сказано вище, вам потрібно "| 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 (як це запропонував Іван Ярош або використовувати #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
Я знаю, що це два роки, але дякую. Для початківців дозвольте спростити його: використовую \ Drupal \ Core \ Render \ Markup $ HeaderSettingsIcon = Markup :: create ('<i class = "fa fa-cogs"> </i>');
Ngatia Frankline

@NgatiaFrankline, чи є спосіб висловити подяку?
десерт

Я зробив це: $ form ['first_name'] = array ('#type' => 'textfield', '#title' => t ('Ваше ім'я:'), '#required' => ІСТИНА, '# attributes '=> array (' class '=> array (' form-control req '),' name '=> array (' first_name ')),' #label_attributes '=> array (' class '=> array (' обов'язковий ')),' #children '=> Розмітка :: 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.