在嫩枝寺庙中显示链接

时间:2018-08-24 13:33:41

标签: twig

这似乎很简单,但是我遇到了奇怪的行为。

在树枝文件中:

{% set my_html = '<a href="#">Hello world</a>' %}
{{- true is not same as(false) ? (true is same as(false) ? ('1'~my_html)|raw : ('2'~my_html)|raw) -}}

打印的部分是('2'~my_html)|raw,它工作正常:我看到了一个真实的链接。

输出为:

2 Hello world

现在,它只能工作,因为我将原始过滤器应用于('1'~my_html) ...试试:

{% set my_html = '<a href="#">Hello world</a>' %}
{{- true is not same as(false) ? (true is same as(false) ? ('1'~my_html) : ('2'~my_html)|raw) -}}

它将显示:2<a href="#">Hello world</a>

我不明白为什么我需要对其他内容应用过滤器才能获得预期的结果?这是一个错误吗?

2 个答案:

答案 0 :(得分:1)

这是raw过滤器的已记录行为。我引用了该页面上的注释:

  

在表达式中使用原始过滤器时要小心:

{% autoescape %}
    {% set hello = '<strong>Hello</strong>' %}
    {% set hola = '<strong>Hola</strong>' %}

    {{ false ? '<strong>Hola</strong>' : hello|raw }}
    does not render the same as
    {{ false ? hola : hello|raw }}
    but renders the same as
    {{ (false ? hola : hello)|raw }} {% endautoescape %}
     

第一个三元语句未转义:hello被标记为   安全且Twig不会转义静态值(请参见escape)。在里面   第二个三元声明,即使hello被标记为安全,hola   仍然是不安全的,整个表达也是如此。第三三元   语句被标记为安全且结果无法转义。

在github问题上的comment澄清了串联运算符将您的字符串标记为不安全。所以就你而言

{% set my_html = '<' %}
{#  ('1'~my_html) is not safe, so the whole expression is not #}
{{ false
    ? ('1'~my_html)
    : ('2'~my_html)|raw
}}

包括两个字符串:一个安全的字符串('2'~my_html)|raw和一个不安全的字符串('1'~my_html)(因为它不应用raw过滤器),例如{{1 }}文档说,整个表达式保持不安全,并应用了自动转义。但是在另一种情况下,当两个字符串都标记为安全时,整个表达式将变得安全并且不应用自动转义:

raw

答案 1 :(得分:0)

这不是错误,但是由于twig的默认设置会自动转义变量。
您可以在documentation中阅读有关它的更多信息。