Blog d'un passionné du web (Symfony2, HTML5, Sass, Gulp…)

Mon site freelance
Mon Facebook - Mon Twitter

Ordonner une liste dans Symfony avec Doctrine & Twig

Voici deux petites méthodes qui vont vous permettre d’ordonner vos entités sans le spécifier dans la requête. Cela est d’autant plus utile pour les entités liées !

OrderBy Doctrine : méthode 1

Cette première méthode est la plus simple et suffira dans la plupart des cas. Il suffit d’utiliser l’annotation prévue par Doctrine … rien de compliqué mais encore faut il être au courant. Désormais plus d’excuse!

/** 
 * @ORM\OneToMany(targetEntity="AppBundle\Entity\Level", mappedBy="level")
 * @ORM\OrderBy({"order" = "DESC", "id" = "DESC"})
*/
$levels;

OrderBy Twig : méthode 2

Cette deuxième méthode est bien utile parfois et peut-être réutilisée pour différents projets. Je n’ai pas écris ce code moi même, il doit provenir d’un gist dont je n’ai plus la source 🙁 .

L’utilisation

{% for course in program.courses | sortByField('itemNumber')%}
  • {{ course.title }}

{% endfor %}

Et voilà on peut afficher n’importe quelle liste dans en l’ordonnançant sur le champs qui nous intéresse.
Ha oui si je vous donne l’extension c’est mieux !

Extension twig

Si vous avez des doutes sur comment mettre en place une extension : comment mettre en place une extension twig ?


class SortByFieldExtension extends \Twig_Extension
{
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('sortByField', array($this, 'sortByField')),
        );
    }

    public function sortByField($content, $sort_by, $direction = 'asc'){
        if (is_a($content, 'Doctrine\ORM\PersistentCollection')) {
            $content = $content->toArray();
        }
        if (!is_array($content)) {
            throw new \InvalidArgumentException('Variable passed to the sortByField filter is not an array');
        } elseif (count($content) < 1) { return $content; } else { @usort($content, function ($a, $b) use ($sort_by, $direction) { $flip = ($direction === 'desc') ? -1 : 1; if (is_array($a)) $a_sort_value = $a[$sort_by]; else if (method_exists($a, 'get' . ucfirst($sort_by))) $a_sort_value = $a->{'get' . ucfirst($sort_by)}();
                else
                    $a_sort_value = $a->$sort_by;
                if (is_array($b))
                    $b_sort_value = $b[$sort_by];
                else if (method_exists($b, 'get' . ucfirst($sort_by)))
                    $b_sort_value = $b->{'get' . ucfirst($sort_by)}();
                else
                    $b_sort_value = $b->$sort_by;
                if ($a_sort_value == $b_sort_value) {
                    return 0;
                } else if ($a_sort_value > $b_sort_value) {
                    return (1 * $flip);
                } else {
                    return (-1 * $flip);
                }
            });
        }
        return $content;
    }

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

Voilà c’est bon tout est dans l’ordre !

23 novembre 2016


Previous Post

Next Post