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 !