Paginer une liste d'éléments avec Symfony

Découvrez comment mettre en place un système de pagination sur votre site très simplement

5 oct. 2020 à 10:33 – 6min


Table des matières

Bonjour et bienvenue dans ce nouvel article ! Aujourd'hui, nous allons voir comment mettre en place un système de pagination sur votre site très rapidement. 

Vous le savez certainement, mais lorsque vous souhaitez afficher sur votre page un grand nombre d'éléments, il est judicieux de paginer ces résultats, c'est-à-dire de les affichers sur plusieurs pages différentes. Celà a plusieurs avantages : 

Que vous développiez un blog, un site marchand ou n'importe quel autre type de plateforme qui présente de nombreux résultats à ses utilisateurs, vous vous rendez bien compte qu'il est primordial d'utiliser la pagination sur votre site. Voyons donc comment mettre en place ce système très facilement avec Symfony !

Mise en place du projet

Pour les besoins de ce projet, je vais continuer notre série consacrée à la création d'un blog, et donc je vais vouloir lister et paginer des articles de blog. Si vous n'avez pas suivi le reste de cette série, pas de panique ! Vous aurez simplement besoin d'avoir une application Symfony déjà configurée pour utiliser des éléments en base de données avec Doctrine. Ici, je vais donc utiliser mon entité Article, qui contient un titre et une description.  

Et puis... c'est tout ! Il existe en effet des bundles qui peuvent vous mâcher le travail, mais je trouvais ici plus intéressant de vous montrer comment créer un système de pagination par vous-même. Ne vous inquiétez pas, il n'y a rien de compliqué !

Créer une requête Doctrine pour récupérer vos résultats

La première étape va consiste à créer une nouvelle méthode dans le repository de votre entité qui sera capable de vous retourner les résultats dans un intervalle donné. Si vous souhaitez afficher, disons, 10 éléments par page, nous allons avoir besoin de récupérer les éléments 0 à 9 pour la première page, 10 à 19 pour la seconde et ainsi de suite. 

Ajoutez-donc cette fonction dans votre repository : 

Ici, nous indiquons à Doctrine que nous souhaitons récupérer les résultats triés par identifiant. Cette indication n'est pas très utile puisque c'est l'opération effectuée par défaut. Dans votre cas, vous aurez sûrement envie de trier vos résultats par date de création ou de modification par exemple. 

Dans cette fonction, vous remarquez que nous renvoyons un objet Paginator. Cet objet est fourni par Doctrine et expose certaines fonctions qui pourront vous être utiles par la suite, notamment la fonction count(), qui renvoie simplement le nombre total d'objets dans votre collection. 

Afficher les résultats

Le controller

Maintenant que nous avons configuré notre repository, nous pouvons récupérer notre Paginator dans un controller :

Quelques explications s'imposent. Dans la réponse, je retourne un tableau "pagination" qui contient les éléments suivants : 

Le fait de renvoyer null ou non pour ces valeurs va nous permettre d'afficher, ou non, un bouton "suivant" et "précédent" sur nos pages, qui redirigera automatiquement l'utilisateur vers notre route avec le bon paramètre "page".

Le template Twig

Nous pouvons maintenant enfin afficher notre pagination sur notre page :

Ce code est assez trivial, nous listons simplement nos éléments dans la boucle for, puis nous affichons de manière conditionnelle les boutons "suivant" et "précédent" en vérifiant si leur valeur est nulle ou non. 

Et voilà, comme vous l'avez vu, il n'y a rien de très complexe à mettre en place par soi-même un système de pagination. Il ne reste maintenant plus qu'à l'améliorer en le stylisant à votre guise !