为什么没有渲染带有标记的Twig模板变量?


8

在我的模板预处理函数中,我有一个变量:

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

然后将其传递给我的模板:

$variables['test'] = $test;

并输出到树枝中:

{{test}}

但是我没有得到格式化的段落,而是得到了纯文本格式的原始输出:

<p>this is a paragraph</p>

如何获得Drupal将此呈现为普通HTML?

Answers:


14

因为树枝会自动转义不安全的内容,并且您的内容未标记为安全。

您可以明确地告诉它与$test = Markup::create($test);但是您应该对此非常小心。如果它包含任何类型的用户输入,则可能会出现XSS问题。

更好的方法是使用[[#markup] =>'您的文本']之类的渲染数组,默认情况下将允许一定数量的html标签,但不是全部。您还可以使用此处记录的内联模板:https : //www.drupal.org/node/2311123

Twig本机理解渲染数组,因此,如果您提供渲染数组或字符串,则对模板而言都无关紧要。


2
我发现通过使用原始过滤器,可以获得所需的输出,因此:{{test | raw}}给出了“这是一个段落”而没有标记。
RominRonin

1
好的,所以原始文件是不安全的,我不知道该如何使用您提供的示例文档
RominRonin

1
好的,在一些#drupal IRC闲置者的帮助下,我发现了这一点:drupal.org/node/2296163,其中包含一些用于在树枝中输出标记的选项。
RominRonin

1
在我的示例中,我从数据库查询中检索了$ test,并且字段数据与标记一起存储(基本html ckeditor字段),因此#markup方法与此用例最相关。
RominRonin

12

这是将$ test包装在段落中并将其传递到树枝模板的两种可能性:

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

$variables['test'] = [
  '#type' => 'inline_template',
  '#template' => '<p>{{ text }}</p>',
  '#context' => [
    'text' => $test,
  ],
];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.