mengapa variabel templat ranting dengan markup tidak dirender?


8

Dalam fungsi preproses template saya, saya memiliki variabel:

$test = "<p>this is a paragraph</p>";

dan saya meneruskannya ke templat saya:

$variables['test'] = $test;

dan output dalam ranting:

{{test}}

tetapi alih-alih mendapatkan paragraf yang diformat, saya mendapatkan output asli dalam teks biasa:

<p>this is a paragraph</p>

Bagaimana cara membuat Drupal membuat ini sebagai HTML normal?

Jawaban:


14

Karena ranting otomatis keluar dari konten yang tidak aman dan konten Anda tidak ditandai sebagai aman.

Anda dapat secara eksplisit mengatakan itu dengan $test = Markup::create($test); tetapi Anda harus sangat berhati-hati dengan itu. Jika berisi input pengguna apa pun, Anda dapat membuka diri untuk masalah XSS.

Pendekatan yang lebih baik menggunakan array render seperti ['#markup' => 'your text'] yang secara default akan memungkinkan sejumlah tag html tertentu tetapi tidak semuanya. Anda juga dapat menggunakan templat sebaris seperti yang didokumentasikan di sini: https://www.drupal.org/node/2311123 .

Twig secara asli memahami array render, jadi tidak masalah untuk template Anda jika Anda memberikan array render atau string.


2
Saya menemukan bahwa dengan menggunakan filter mentah, saya mendapatkan output yang saya butuhkan, jadi: {{test | raw}} memberi 'ini paragraf' tanpa markup.
RominRonin

1
ok, jadi mentah tidak aman dan saya tidak mengerti bagaimana saya harus menggunakan contoh dokumentasi yang Anda berikan
RominRonin

1
Ok, dengan bantuan beberapa pemalas IRC #drupal saya menemukan ini: drupal.org/node/2296163 yang berisi beberapa opsi untuk menghasilkan markup di ranting.
RominRonin

1
Dalam contoh saya, saya mengambil $ test dari permintaan db, dan data lapangan disimpan dengan markup (bidang html ckeditor dasar), jadi metode #markup adalah yang paling relevan untuk kasus penggunaan ini.
RominRonin

12

Ini adalah dua kemungkinan untuk membungkus $ test dalam sebuah paragraf dan meneruskannya ke templat ranting:

$variables['test'] = [
  '#markup' => $test,
  '#prefix' => '<p>',
  '#suffix' => '</p>',
];

$variables['test'] = [
  '#type' => 'inline_template',
  '#template' => '<p>{{ text }}</p>',
  '#context' => [
    'text' => $test,
  ],
];
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.