2015-03-10 3 views
1

При использовании тройного оператора прутика в, все идет, как и ожидалось, КРОМЕ |raw фильтра не применяются, когда условие ложно:Twig тройные не прилагая фильтр, если ложные

{{ 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 не применяется при использовании троичной синтаксиса.

ответ

3

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

При выполнении операции, значение помечается как небезопасных. |raw отметьте его как safe. Если вы попытаетесь напечатать небезопасное значение с помощью {{ ... }}, оно будет экранировано. Это то, как разработан Twig.

Давайте проанализируем, что простой код: {{ (a|raw) ~ (b|raw) }}

  1. a отмечен как безопасный.
  2. b отмечен как безопасный.
  3. a и b склеены. Он отмечен как небезопасный, потому что ~ - это операция.
  4. Значение a ~ b печатается ESCAPED. Вау.

Вы должны использовать {{ (a ~ b)|raw }}.

В вашей проблеме: сначала вы вычисляете thing.description|raw, а затем переходите к тернарному. Результаты отмечены как небезопасные, так как тройная операция. Вы должны использовать |raw после всех операций, поэтому {% if %} - единственное решение.

+0

Спасибо за отличное объяснение! – willanderson