Przekaż surowy html do #markup

24

Mam pewne treści HTML, pochodzi z zewnętrznej biblioteki, więc nie można go zmienić, to ma wiele <span>i <div>tagi z atrybutów takich jak: <span style="color: #0000ff;">, ale kiedy używać:

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

W tablicy renderowania Drupal usuwa atrybuty i zachowuje się <span>bez stylów.

Jak więc uniknąć zmian Drupala, które przekazuję jako znaczniki, które nie wymagają żadnego filtru, ponieważ biblioteka zapewnia bezpieczeństwo, lub wreszcie pozwala na style?

Yukare
źródło
atrybuty stylu są zawsze usuwane
Yzmir Ramirez

Odpowiedzi:

28

Użyj szablonu wbudowanego:

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

W twoim przypadku bez kontekstu, po prostu prosto w górę HTML.

Możesz także użyć elementu html_tag do skryptu lub linku i tak dalej.


źródło
2
To odfiltrowuje tagi IFRAME.
joachim
1
Oraz tagi skryptowe i stylowe
Yzmir Ramirez
8
Spróbuj {{zmienna | raw}} lub <tag> {{zmienna}} </tag>
1
@IvanJaros Pominie to automatyczne ucieczkę variable, ale `\ Drupal \ Component \ Utility \ Xss :: filterAdmin ()` nadal odfiltruje tagi, takie jak <script> i atrybuty stylu. Jedyny sposób, jaki do tej pory widziałem, to dodanie pliku JavaScript jako biblioteki i dodanie „#attached” => „library” => „nazwa_modułu / nazwa_biblioteki w_ymlu” do powyższego return. @see drupal.stackexchange.com/questions/211078/…
Yzmir Ramirez
1
Czy ktoś wie, czy to jedyny / najlepszy sposób robienia komentarzy HTML? np. <! - Witaj, świecie! -> (nb: jak wspomniano powyżej potrzebujesz '| raw')
William Turrell
18

Jak udokumentowano w przeglądzie API renderowania , w Drupal 8 ciąg przekazywany do #markup jest przekazywany przez \ Drupal \ Component \ Utility \ Xss :: filterAdmin () , który usuwa znane wektory XSS, jednocześnie dopuszczając dopuszczalną listę znaczników HTML, które nie są XSS wektory. Możesz użyć #allowed_tags, aby ustawić listę dozwolonych tagów, ale to nie powstrzyma Drupala przed usunięciem atrybutów (np. Stylu).

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

Ponieważ w twoim przypadku przekazujesz złożone znaczniki HTML, powinieneś użyć #type (zgodnie z sugestią Ivana Jarosa lub #theme. W takim przypadku #type wydaje się lepszym rozwiązaniem.

Możesz także zaimplementować nowy typ z wtyczką elementu renderującego, ale jeśli jest to jedyny przypadek, w którym jest to potrzebne, wówczas implementacja wtyczki elementu renderującego jest prawdopodobnie nadmierna.

kiamlaluno
źródło
12

Jeśli chcesz dodać zwykły znacznik do renderowania tablic, możesz go utworzyć za pomocą \ Drupal \ Core \ Render \ Markup . To pozwoli ci włożyć w coś surowy HTML. Na przykład oto, jak jest on używany w module Raport uprawnień do umieszczania HTML w tabelach :

$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))],
];
nvahalik
źródło
3
Wiem, że to dwa lata później, ale dziękuję. Dla początkujących pozwolę sobie uprościć: użyj \ Drupal \ Core \ Render \ Markup $ HeaderSettingsIcon = Markup :: create ('<i class = "fa fa-cogs"> </i>');
Ngatia Frankline,
@NgatiaFrankline, czy istnieje sposób, by zaoferować Ci moją wdzięczność?
dresh,
Zrobiłem to: $ form ['first_name'] = array ('#type' => 'textfield', '#title' => t ('Your First Name:'), '#required' => TRUE, '# atrybuty = = tablica ('klasa' => tablica ('form-control req'), 'nazwa' => tablica ('pierwsza_nazwa')), '#label_attributes' => tablica ('klasa' => tablica (' obowiązkowe ')),' #children '=> Markup :: create (' <span class = "error-text"> Wpisz poprawne imię </span> '),);
dresh
12

W tablicy renderowania po prostu zrób to:

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

Np. Jeśli $htmlzostał stworzony przy pomocy PHP highlight_string(), będzie zawierał atrybuty stylu, które zostaną usunięte #markup. Ale #childrenje zachowuje.

Don Kichot
źródło
Tak - działało dla mnie. zamiast tego #markup użyj innych słów kluczowych, takich jak #scode lub #children lub #customname
manimjs