如果 false,Twig 三元不应用过滤器

Twig ternary not applying filter if false

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

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

当为真时,它正在应用 |striptags|slice(0,255) 过滤器。

|raw 过滤器在像这样(和错误)编码时得到应用:

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

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

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。哇

您必须使用 {{ (a ~ b)|raw }}

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