Utiliser les extensions Twig natives de Symfony 2

Symfony2 standard intègre quelques extensions supplémentaires de twig qui ne sont cependant pas toutes activées par défaut.

Versions testées : de 2.0.x à 2.6.x

Activer ces extensions

app/config/config.yml

services:
    twig.extension.text:
       class: Twig_Extensions_Extension_Text
       tags:
            - { name: twig.extension }

    twig.extension.intl:
        class: Twig_Extensions_Extension_Intl
        tags:
            - { name: twig.extension }

    twig.extension.debug:
        class: Twig_Extensions_Extension_Debug
        tags:
            - { name: twig.extension }
 

Les extensions

  • Debug : ajoute un tag « debug » qui affiche le context courant du template (un var_dump sur toutes les données accessibles). Cette extension ne fonctionne que si le mode debug de twig est activé, ce qui est le cas par défaut dans SF2 standard si vous êtes en environnement « dev ».
    Syntaxe : {% debug %}
    Attention cependant, il est fréquent que vos templates contiennent des objets eux mêmes contenant d’autres objets etc. rendant le dump de debug très groumant en mémoire et arrivant très vite à la limite que vous aurez configuré pour PHP.
  • i18n : permet de gérer des traductions de chaine (type gettext en php), cette fonctionnalités est déjà disponible de base dans Symfony sans rien activer de plus.
  • Intl : ajoute un filtre « localizeddate » qui permet de formater une date en prenant en
    compte la langue (basée sur la locale) de la session courante de sf2. Ce filtre utilise la classe IntlDateFormatter de php.
    Syntaxe : {{ maDate | localizeddate(‘tailleDate‘, ‘tailleHeure‘, ‘locale‘ }}
    « maDate » doit être un objet DateTime, pas une chaîne.
    tailleDate : none/short/medium/long/full
    tailleHeure : none/short/medium/long/full
    locale : facultatif, par défaut utilisera la langue de la session mais il est possible de forcer une locale.
    Exemples :

    <!-- maDate est un DateTime au 21/12/2012 à 13:37:00 -->
    {{ maDate | localizeddate('short', 'none') }}
    <!--
    locale "fr" : 21/12/2012
    locale "en : 12/21/2012
    -->
    {{ maDate | localizeddate('full', 'none') }} ({{ maDate | localizeddate('none, 'short') }})
    <!--
    locale "fr" : vendredi 21 décembre 2012 (13:37)
    locale "en : Friday, December 21, 2012 (13:37 PM)
    -->
    

    Si votre date n’est qu’en anglais et que lorsque vous forcez une autre langue vous obtenez l’erreur : « Please install the ‘intl’ extension for full localization capabilities.« , alors il vous faut installer l’extension PHP « intl », sur Ubuntu/Debian il vous suffit de faire :

    aptitude install php5-intl
  • Text : ajoute un filtre « truncate » qui permet de limiter la longueur d’une chaine, un filtre « wordwrap » qui comme la fonction php du même nom effectue la césure d’une chaîne et un filtre « nl2br » qui encore une fois applique le même traitement qu’en php, à savoir convertir les retour à la ligne au format « \n » en des retours à la ligne html « <br /> ». Syntaxes :
    {{ chaine | truncate(longueur, preserve, fin) }}
    longueur : à combien de
    caractères faut-il couper la chaine.
    preserve :
    empêcher ou non de couper un mot en deux, faux par défaut.
    fin
    : sa valeur par défaut est « … »{{ chaine | wordwrap(largeur, separateur, preserve) }}
    largeur : de combien de caractères de largeur doit faire votre texte.
    separateur: chaine utilisé pour séparer chaque « ligne ». Par défaut le filtre insère un retour à la ligne de type « \n ».
    preserve: permettre ou non de couper un mot en deux, faux par défaut.
    Exemples :
    {% set maChaine = "Si vous cherchez un expert symfony2, ne cherchez plus, devenez le." %}
    {{ maChaine | truncate(10, false, '') }}  // affiche "Si vous ch"
    {{ maChaine | truncate(10, true, '[...]') }} // affiche "Si vous cherchez[...]"
    
    {{ maChaine | wordwrap(10) | nl2br }}
     <!-- affiche :
     Si vous ch
     erchez un
     expert sym
     fony2, ne
     cherchez p
     lus, deven
     ez le.
    -->
    
    <!-- (vous pouvez aussi remplacer "\n" par "<br />" et "nl2br" par "raw") -->
    {{ maChaine | wordwrap(10, "\n", true) | nl2br }}
    <!-- affiche :
    Si vous cherchez
    un expert
    symfony2,
    ne cherchez
    plus, devenez
    le.
    -->
    

Note : au moment ou j’écris ces lignes, le comportement de wordwrap lorsque « preserve » est à « true » n’est pas toute à fait correct, mais devrais être corrigé bientôt.

9 réflexions au sujet de « Utiliser les extensions Twig natives de Symfony 2 »

  1. sbeex

    Merci beaucoup ! Je vais te faire backlink sur mon blog c’est vraiment un article utile.

    @cordoval sorry for you but… learn french :) We do the effort to read articles, documentations and so on in english so I think you can do the same. See u

  2. Ping : Twig – Activer les filtres tel que truncate

  3. medy

    bonjour,

    SVP je cherche à faire des testes OR,AND dans des tags comme ceci
    :

    {% if app.session.get(‘var’) == ‘Achats’ || app.session.get(‘var’) == ‘AgentLogistic’ %}

    Stock


    {% endif %}

    1. Easytek Auteur de l’article

      Il faut tout simplement écrire le mot correspondant (or / and) :

      {% if condition1 or condition2 %}Stock{% endif %}

  4. julitac

    Bonjour et merci pour votre article !

    Je développe actuellement un projet avec twig et j’ai un soucis sur le truncate, je ne trouve rien sur internet qui pourrait m’apporter une solution donc je me permets de venir vers vous, peut-être pourriez-vous m’aider !

    Pour l’affichage d’un nom, je fais un truncate au 13eme caractère (truncate(13) ou truncate(13, false,  ») ) ce qui marche très bien. Je viens par contre je me rendre compte que quand le truncate se fait sur le caractère « ç » ça ne marche pas, non seulement la coupure n’est pas faite mais en plus le nom ne s’affiche pas sur ma page. J’ai essayé de voir si j’avais le même problème avec les é, è, à etc mais pour ceux là aucun soucis. Et en faisant un truncate avant ou après le « ç » tout marche également, c’est vraiment sur le « ç » que ça coince.

    Avez-vous déjà été confronté à ce soucis ? Avez-vous une idée de comment je pourrais le résoudre ?

    En vous remerciant !

Les commentaires sont fermés.