Twig三元如果不是则不应用过滤器

时间:2015-03-10 15:06:58

标签: twig

使用Twig的三元运算符时,一切都按预期运行除了条件为假时未应用|raw过滤器:

{{ thing.description|length > 255 ? thing.description|striptags|slice(0,255) ~ '...' : thing.description|raw }}

如果为true,则应用|striptags|slice(0,255)过滤器。

|raw过滤器在编码时会被应用(和false):

{% if thing.description|length > 255 %}
    {{ thing.description|striptags|slice(0,255) ~ '...' }}
{% else %}
    {{ thing.description|raw }}
{% endif %}

对于我的生活,我无法弄清楚为什么|raw在使用三元语法时不适用。

1 个答案:

答案 0 :(得分:4)

In fact |raw do nothing. Really. Look at its code here.

执行操作时,值标记为不安全|raw将其标记为安全。如果您尝试使用{{ ... }}打印不安全的值,它将被转义。它是如何设计Twig的。

让我们分析一下这个简单的代码:{{ (a|raw) ~ (b|raw) }}

  1. a被标记为安全。
  2. b被标记为安全。
  3. ab粘在一起。它被标记为不安全,因为~是一项操作。
  4. a ~ b打印 ESCAPED 。哇。
  5. 您必须使用{{ (a ~ b)|raw }}

    在您的问题中:首先计算thing.description|raw,然后将其传递给三元组。结果被标记为不安全,因为三元是操作。在所有操作之后,您必须使用|raw,因此{% if %}是唯一的解决方案。