Faire un include avec Symfony2 et Twig

Avec Symfony 1.4, il était possible de faire 2 sortes d’include différents : le partial et le component. La différence était qu’un partial permettait une include assez classique, en revanche le component permettait d’avoir des actions propres.

Sur Symfony2, et avec TWIG, les deux méthodes sont conservées, même si celles-ci ne portent plus les mêmes noms officiels.

Pour faire un include classique sous Symfony2, de type Partial, on utilise la syntaxe suivante :

{% include "MyBundle:Controller:myTemplate.html.twig" %}

Notez que si vous voulez inclure un template présent dans app/ressources/views, vous n’êtes pas dans un Bundle, et n’avez pas de controller attitré, la bonne syntaxe serait alors

{% include "::myTemplate.html.twig" %}

Dans d’autres cas, vous aurez besoin de faire des traitements propres à ces templates, il vous faudrait donc un controller et une action propre à ce template. L’appel de l’inclusion se fait alors d’une autre manière: avec render.

{# dans mon template twig #}
{% render "MyAppMyBundle:myController:myTemplate" %}

{# pour prendre un exemple :#}
{% render "MonsiteDiscussionBundle:Blog:listeDeMesMessages" %}

(A noter une différence avec l’inclusion classique faite avec ‘include’, cela marche en ne mettant pas l’extension de fichier .html.htwig après le nom du template.)

Le controller utilisé est donc :

//MyApp\MyBundle\Controller;

public function listeDeMesMessagesAction()
{
          //mon traitement
          $maVar = 'lorem ipsum';

         return $this->container->get('templating')->renderResponse('MonsiteDiscussionBundle:Blog:listeDeMesMessages.html.twig', array(
           'maVar' => $maVar
        ));
}

Dans votre template TWIG, vous pouvez donc désormais appeler votre variable et en faire ce que vous voulez, comme par exemple l’afficher avec :

{{ maVar }}

Limiter la longueur d’une chaîne avec TWIG et le filtre truncate

Avec TWIG, il est possible d’appliquer des filtres à nos variables, et des fonctionnalités semblables à la function truncate() utilisée avec PHP. Pour pouvoir utiliser ces filtres, il est nécessaire d’activer certaines extensions TWIG.

L’extension dont nous avons besoin pour limiter la longueur d’une chaîne est l’extension text. Sans avoir ajouté cette extension, vous avez l’erreur suivante:

The filter « truncate » does not exist in …

Pour l’activer, rendez vous dans votre config.yml, et rajoutez dans le service suivant :

//app/config/config.yml
services:
    twig.extension.text:
       class: Twig_Extensions_Extension_Text
       tags:
           - { name: twig.extension }

 

A partir de là, vous pouvez depuis votre template utiliser le filtre Truncate, avec la syntaxe suivante :

{# in twig template #}
{{ myString | truncate(20, false, '') }}
{# cette première utilsation coupe directement la chaîne myString #}
{{ myString | truncate(20, true, '...') }}
{# cette deuxieme utilsation coupe la chaîne myString en rajoutant ' ... ' à la suite #}

Une autre méthode pour couper une chaîne de caractères avec Twig est de faire comme suivant :

{{ uneVideo.titreVideo[:25] }}

C’est assez explicite aussi de cette façon ! Néanmoins, cette méthode ne permet pas de rajouter des points de suspension en fin de chaîne tronquée… mais si vous avez la solution, je veux bien la connaître par curiosité ;) !

Comparer deux dates avec TWIG

Lors du développement d’un projet, il est fréquent de devoir comparer deux dates. Grâce à TWIG, c’est très pratique de manipuler les objets mais aussi d’en faire autant avec les dates, et ceci sensiblement de la même manière qu’avec PHP et sa fonction date();

Voici la syntaxe TWIG à utiliser dans un template :

{% if "now"|date('Ymd')  > evenement.date|date('Ymd') %}
   Mon évènement est terminé
{% else %}
   Mon évènement est à venir / en cours
{% endif %}

Attention à bien vérifier l’ordre ‘Ymd’ comme paramètre de date(), en étant étourdi on arrive vite à des résultats improbables : 20121005 (YearMonthDay) n’est pas égal à 05102012 (DayMonthYear).

De même que date(‘Ymd’) n’est pas égal à date(‘Y m d’).