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?


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.


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.


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))],
];

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.


Tak - działało dla mnie. zamiast tego #markup użyj innych słów kluczowych, takich jak #scode lub #children lub #customname
— manimjs
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.