web-dev-qa-db-fra.com

"Commence par" dans le modèle Twig

J'ai un modèle twig où je voudrais tester si un élément commence par une certaine valeur

{% if item.ContentTypeId == '0x0120' %}
    <td><a href='?parentId={{ item.Id }}'>{{ item.BaseName }}</a><br /></td>
{% else %}
    <td><a href='?{{ item.UrlPrefix }}'>{{ item.LinkFilename }}</a></td>
{% endif %}

Le 0x0120 peut ressembler à cela ou être plus complexe comme celui-ci 0x0120D52000D430D2B0D8DD6F4BBB16123680E4F78700654036413B65C740B168E780DA0FB4BX. La seule chose que je veux faire est de m'assurer qu'il démarre avec le 0x0120.

La solution idéale serait de résoudre ce problème en utilisant l'expression régulière, mais je ne sais pas si Twig prend en charge cela?

Merci

29
Eric Herlitz

Oui, Twig prend en charge les expressions régulières dans les comparaisons: http://twig.sensiolabs.org/doc/templates.html#comparisons

Dans votre cas, ce serait:

{% if item.ContentTypeId matches '/^0x0120.*/' %}
  ...
{% else %}
  ...
{% endif %}
27
Marek

Vous pouvez le faire directement dans Twig now:

{% if 'World' starts with 'F' %}
{% endif %}

"Se termine par" est également pris en charge:

{% if 'Hello' ends with 'n' %}
{% endif %}

D'autres mots-clés pratiques existent également:

Comparaisons de chaînes complexes:

{% if phone matches '{^[\\d\\.]+$}' %} {% endif %}

(Remarque: les doubles barres obliques inverses sont converties en une seule barre oblique inverse par une brindille)

La chaîne contient:

{{ 'cd' in 'abcde' }}
{{ 1 in [1, 2, 3] }}

Voir plus d'informations ici: http://twig.sensiolabs.org/doc/templates.html#comparisons

93
benske

Vous pouvez simplement utiliser le filtre slice . Faites simplement:

{% if item.ContentTypeId[:6] == '0x0120' %}
{% endif %}
7
Prisoner

Vous pouvez toujours créer votre propre filtre qui effectue la comparaison nécessaire.

Selon le docs :

Lorsqu'il est appelé par Twig, le PHP callable reçoit le côté gauche du filtre (avant le canal |) comme premier argument et les arguments supplémentaires passés au filtre (entre parenthèses ()) comme extra arguments.

Voici donc un exemple modifié.

La création d'un filtre est aussi simple que d'associer un nom à un PHP callable:

// an anonymous function
$filter = new Twig_SimpleFilter('compareBeginning', function ($longString, $startsWith) {
    /* do your work here */
});

Ensuite, ajoutez le filtre à votre environnement Twig:

$twig = new Twig_Environment($loader);
$twig->addFilter($filter);

Et voici comment l'utiliser dans un modèle:

{% if item.ContentTypeId | compareBeginning('0x0120') == true %}
{# not sure of the precedence of | and == above, may need parentheses #}

Je ne suis pas un PHP guy, donc je ne sais pas comment PHP fait des regexes, mais la fonction anonyme ci-dessus est conçue pour renvoyer true si $longString commence par $startsWith. Je suis sûr que vous trouverez cela trivial à mettre en œuvre.

1
ladaghini