マークアップ付きのTwigテンプレート変数がレンダリングされないのはなぜですか?


8

私のテンプレート前処理関数には変数があります:

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

そしてそれを私のテンプレートに渡します:

$variables['test'] = $test;

そしてそれを小枝に出力します:

{{test}}

しかし、書式設定された段落を取得する代わりに、元の出力をプレーンテキストで取得しています。

<p>this is a paragraph</p>

Drupalでこれを通常のHTMLとしてレンダリングするにはどうすればよいですか?

回答:


14

twigは安全でないコンテンツを自動エスケープし、コンテンツは安全とマークされていないためです。

それがであることを明示的に伝えることができ$test = Markup::create($test)ます。しかし、あなたはそれに非常に注意する必要があります。何らかのユーザー入力が含まれている場合は、XSSの問題が発生する可能性があります。

より適切な方法は、['#markup' => 'your text']のようなレンダー配列を使用することです。デフォルトでは、特定の量のhtmlタグが許可されますが、すべてが許可されるわけではありません。ここに記載されているインラインテンプレートを使用することもできます:https : //www.drupal.org/node/2311123

Twigはレンダー配列をネイティブに理解するため、レンダー配列または文字列を提供するかどうかは、テンプレートにとって重要ではありません。


2
rawフィルターを使用すると、必要な出力が得られることがわかったので、{{test | raw}}は、「これは段落です」とマークアップなしで示しています。
RominRonin 2016年

1
わかりました、それで生は安全ではなく、あなたが提供したサンプルのドキュメントをどのように使うべきか分かりません
RominRonin

1
OK、#drupal IRCアイドラーの助けを借りて、これを見つけました:drupal.org/node/2296163には、twigでマークアップを出力するためのいくつかのオプションが含まれています。
RominRonin 2016年

1
私の例では、dbクエリから$ testを取得し、フィールドデータはマークアップ(基本html ckeditorフィールド)で格納されたため、この使用例には#markupメソッドが最も関連性がありました。
RominRonin 2016年

12

これらは、$ testを段落にラップしてtwigテンプレートに渡す2つの可能性です。

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

$variables['test'] = [
  '#type' => 'inline_template',
  '#template' => '<p>{{ text }}</p>',
  '#context' => [
    'text' => $test,
  ],
];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.