mercredi 23 octobre 2013

[Symfony2+Twig] Filter sur une différence de date

C'est tout bête mais je donne l'info pour calculer la différence d'une date dans un template twig.
J'en ai eu besoin dans mon actuel projet perso visible ici :
https://github.com/julnegre/activities_management/

Si ce n'est pas déjà fait ajouter à votre config.yml :
services:    
  jng.twig.jng_extension: 
        class: Jng\ActivityBundle\Twig\JngExtension 
        tags: 
            - { name: twig.extension }   

Dans votre bundle puis dans le dossier twig, pour mon projet : src/Jng/ActivityBundle/Twig/JngExtension.php
Nous allons mettre le code suivant :

class JngExtension extends \Twig_Extension 
{ 
    public function getFilters() 
    { 
        return array( 
            'diffToDate' => new \Twig_Filter_Method($this, 'diffToDateFilter'), 
        ); 
    } 

    public function diffToDateFilter($date1, $date2, $unit=null ) 
    { 
        if( is_null($date2) ) 
            return; 

        $t = $date2->getTimestamp()-$date1->getTimestamp(); 
        if( is_null($unit) ){ 
            $unit="s"; 
            if( $t >= 3600) 
                $unit = "h"; 
            else if( $t >= 60) 
                $unit = "min"; 
        } 

        if( $unit == "s" ) 
            return $t." s"; 
        else if( $unit == "min" ) 
            return round($t/60)." min"; 
        else if( $unit == "h" ) 
            return round($t/3600)." h"; 

    } 

    public function getName() 
    { 
        return 'jng_extension'; 
    } 

}

Ensuite dans votre template on pourra utiliser le filter ainsi :
{{ entity.start|diffToDate(entity.end) }}