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.