brindille: IF avec plusieurs conditions

120

Il semble que j'ai un problème avec une brindille si déclaration.

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

L'erreur est:

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

Je ne comprends pas pourquoi ça ne marche pas, c'est comme si une brindille était perdue avec tous les tuyaux.

J'ai essayé ceci:

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

mais le si échoue également.

Alors essayé ceci:

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

Et ça ne marche toujours pas, même erreur à chaque fois ...

Alors ... cela m'amène à une question très simple: Twig supporte-t-il plusieurs conditions IF?

FMaz008
la source

Réponses:

287

Si je me souviens bien, Twig ne prend pas en charge ||ni les &&opérateurs, mais nécessite oretand doit être utilisé respectivement. J'utiliserais également des parenthèses pour désigner les deux déclarations plus clairement, bien que ce ne soit pas techniquement une exigence.

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

Expressions

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.

Pour des opérations plus complexes, il peut être préférable de placer les expressions individuelles entre parenthèses pour éviter toute confusion:

{% if (foo and bar) or (fizz and (foo + bar == 3)) %}
Ben Swinburne
la source
13
Et bien sûr, je n'ai eu aucune chance de trouver cette table merveilleuse et rapide en regardant la documentation IF: twig.sensiolabs.org/doc/tags/if.html Merci pour la solution!
FMaz008
5
Ils ont tendance à utiliser le wiki sur github pour documenter plus en détail leur code. Cette table vient d' ici
Ben Swinburne
L'utilisation de! = Ne semble pas fonctionner pour moi (peut-être un bogue?): {% If (key! = 'String1') or (key! = 'String2') or (key! = 'String3')%} j'ai donc dû utiliser (key == 'stringN') pour tous et mettre ce dont j'avais besoin dans l'instruction 'else'
timhc22
Vous devez utiliser l' notopérateur pour annuler l'expression.
Ben Swinburne
1
vous avez oublié l'opérateur ternaire?
john Smith