Pass html mentah ke #markup


24

Saya memiliki beberapa konten html, itu berasal dari perpustakaan eksternal sehingga saya tidak dapat mengubahnya, ia memiliki banyak <span>dan <div>tag dengan atribut seperti:, <span style="color: #0000ff;">tetapi ketika saya menggunakan:

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

Dalam array render, Drupal menghapus atribut, dan itu tetap saja <span>tanpa gaya.

Jadi, bagaimana saya bisa menghindari perubahan Drupal apa yang saya lulus sebagai markup, yang tidak memerlukan filter karena perpustakaan membuatnya aman, atau akhirnya membuatnya memungkinkan gaya?


atribut gaya selalu dilucuti
Yzmir Ramirez

Jawaban:


28

Gunakan templat sebaris:

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

Dalam kasus Anda tanpa konteks, langsung saja html.

Anda juga dapat menggunakan elemen html_tag untuk hal-hal seperti skrip atau tautan dan sebagainya.


2
Ini menyaring tag IFRAME.
joachim

1
Dan skrip dan tag gaya
Yzmir Ramirez

8
Coba {{variabel | raw}} atau <tag> {{variable}} </tag>

1
@IvanJaros Itu hanya akan melewatkan otomatis keluar variable, tetapi `\ Drupal \ Component \ Utility \ Xss :: filterAdmin ()` masih akan memfilter tag seperti <script> dan atribut style. Satu-satunya cara yang saya lihat sejauh ini adalah menambahkan file Javascript sebagai perpustakaan dan menambahkan '#attached' => 'library' => "module_name / library_key_in_yml" ke atas return. @lihat drupal.stackexchange.com/questions/211078/…
Yzmir Ramirez

1
Adakah yang tahu kalau ini satu-satunya / cara terbaik untuk melakukan komentar HTML? mis. <! - Halo, Dunia! -> (nb: seperti yang disebutkan di atas Anda perlu '| mentah')
William Turrell

18

Seperti yang didokumentasikan dalam ikhtisar Render API , dalam Drupal 8 string yang dilewatkan ke #markup dilewatkan melalui \ Drupal \ Component \ Utility \ Xss :: filterAdmin () , yang menghapus vektor XSS yang dikenal sambil mengizinkan daftar tag HTML yang permisif yang bukan XSS vektor. Anda dapat menggunakan #allowed_tags untuk mengatur daftar tag yang diizinkan, tetapi itu tidak akan menghentikan Drupal dari melucuti atribut (misalnya gaya).

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

Karena dalam kasus Anda Anda melewati markup HTML yang kompleks, Anda harus menggunakan #type (seperti yang disarankan dari Ivan Jaros atau menggunakan #theme. Dalam kasus ini, #type tampaknya merupakan solusi yang lebih baik.

Anda juga bisa menerapkan tipe baru, dengan plugin elemen render, tetapi jika itu adalah satu-satunya kasus di mana Anda membutuhkannya, maka menerapkan plugin elemen render mungkin berlebihan.


12

Jika Anda ingin menambahkan Markup polos ke render array, Anda dapat membuatnya menggunakan \ Drupal \ Core \ Render \ Markup . Ini akan memungkinkan Anda untuk memasukkan HTML mentah ke dalam sesuatu. Misalnya, inilah cara ini digunakan dalam modul Laporan Izin untuk menempatkan HTML ke dalam tabel :

$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
Saya tahu ini adalah dua tahun ke depan tetapi terima kasih. Untuk pemula, izinkan saya menyederhanakannya: gunakan \ Drupal \ Core \ Render \ Markup $ HeaderSettingsIcon = Markup :: create ('<i class = "fa fa-cogs"> </i>');
Ngatia Frankline

@NgatiaFrankline, apakah ada cara untuk mengucapkan terima kasih kepada Anda?
dresh

Saya melakukan ini: $ form ['first_name'] = array ('#type' => 'textfield', '#title' => t ('Nama Depan Anda:'), '#required' => TRUE, '# atribut '=> array (' class '=> array (' form-control req '),' name '=> array (' first_name ')),' #label_attributes '=> array (' class '=> array (' wajib ')),' #children '=> Markup :: create (' <span class = "error-text"> Silakan masukkan Nama Depan yang benar </span> '),);
dresh

12

Dalam array render, cukup lakukan ini:

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

Misalnya jika $htmldiproduksi dengan PHP highlight_string(), itu akan berisi atribut gaya yang akan dihapus #markup. Tapi #childrenmelestarikannya.


Ya - itu berhasil untuk saya. sebagai gantinya #markup gunakan beberapa kata kunci lain seperti #scode atau #children atau #customname
manimjs
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.