twig: SI con múltiples condiciones

120

Parece que tengo un problema con una declaración twig if.

{%if fields | length > 0 || trans_fields | length > 0 -%}

El error es:

Unexpected token "punctuation" of value "|" ("name" expected) in 

No puedo entender por qué esto no funciona, es como si se perdiera una ramita con todas las tuberías.

He probado esto:

{% set count1 = fields | length %}
{% set count2 = trans_fields | length %}
{%if count1 > 0 || count2 > 0 -%}

pero el si también falla.

Luego intente esto:

{% set count1 = fields | length > 0 %}
{% set count2 = trans_fields | length > 0 %}
{%if count1 || count2 -%}

Y todavía no funciona, el mismo error cada vez ...

Entonces ... eso me lleva a una pregunta realmente simple: ¿Twig admite múltiples condiciones SI?

FMaz008
fuente

Respuestas:

287

Si mal no recuerdo, Twig no admite operadores ||y &&, pero requiere ory andpara usarse respectivamente. También usaría paréntesis para denotar las dos declaraciones con mayor claridad, aunque técnicamente no es un requisito.

{%if ( fields | length > 0 ) or ( trans_fields | length > 0 ) %}

Expresiones

Expressions can be used in {% blocks %} and ${ expressions }.

Operator    Description
==          Does the left expression equal the right expression?
+           Convert both arguments into a number and add them.
-           Convert both arguments into a number and substract them.
*           Convert both arguments into a number and multiply them.
/           Convert both arguments into a number and divide them.
%           Convert both arguments into a number and calculate the rest of the integer division.
~           Convert both arguments into a string and concatenate them.
or          True if the left or the right expression is true.
and         True if the left and the right expression is true.
not         Negate the expression.

Para operaciones más complejas, puede ser mejor envolver las expresiones individuales entre paréntesis para evitar confusiones:

{% if (foo and bar) or (fizz and (foo + bar == 3)) %}
Ben Swinburne
fuente
13
Y, por supuesto, no tuve la oportunidad de encontrar esa tabla maravillosa y que ahorra tiempo al mirar la documentación de IF: twig.sensiolabs.org/doc/tags/if.html ¡ Gracias por la solución!
FMaz008
5
Tienden a usar la wiki en github para documentar más a fondo su código. Esa mesa viene de aquí
Ben Swinburne
Usar! = No pareció funcionar para mí (¿puede ser un error?): {% If (key! = 'String1') or (key! = 'String2') or (key! = 'String3')%} así que tuve que usar (key == 'stringN') para todos ellos y poner lo que necesitaba en la declaración 'else'
timhc22
Necesita usar el notoperador para negar la expresión.
Ben Swinburne
1
olvidaste el operador ternario?
john Smith