Ajouter une pagination dans votre projet Symfony 2

Ce contenu a 6 ans et n'est donc peut-être plus à jour.

Si vous souhaitez ajouter une pagination dans votre projet Symfony 2, vous pouvez utiliser le bundle KnpPaginatorBundle de KnpLabs, une référence dans le monde Symfony, ou alors le faire manuellement avec la méthode que je vais vous présenter.

 

Pour commencer, nous allons nous imaginer une boutique en ligne.

Admettons l’existence de l’entité Product et de son repository ProductRepository.

Vous souhaitez donc afficher sur votre site une liste des produits. Pour cela, dans le repository, vous aurez surement une méthode findAll qui se présente comme ceci:

 

Pour paginer le résultat, nous allons modifier (ou créer) un petit peu ce morceau de code comme suit:

et aussi nous allons ajouter un use:

 

Passons maintenant au controller:

 

Pour la vue, nous devons afficher deux choses: le résultat de notre requête et la pagination. Pour le résultat, c’est aussi simple que cela:

 

Pour la pagination, cela se complique un peu:

Je vous conseillerais d’ailleurs de mettre cette partie de code dans un fichier widget_pagination.html.twig et de l’inclure à chaque fois que vous avez besoin d’une pagination, ce qui vous évitera de refaire ce morceau de code à chaque fois. 🙂

Et voilà, il ne vous reste plus qu’à ajouter un peu de CSS pour rendre le tout plus joli !

0 0 vote
Article Rating
S'abonner
Me notifier des
guest
17 Commentaires
plus anciens
plus récents plus de votes
Inline Feedbacks
View all comments
lorant

J’ai cette erreur :
Semantical Error] The annotation “@Route” in method Oxylis\PlateformBundle\Controller\EmploisController::productsListAction() was never imported. Did you maybe forget to add a “use” statement for this annotation?

lorant

Je comprend pas comment tu fais au niveau de la vue pour l’afficher dans une template twig ?
Même avec le use toujours la même erreur ..;

lorant

[Semantical Error] The annotation “@Template” in method Oxylis\PlateformBundle\Controller\EmploisController::productsListAction() was never imported. Did you maybe forget to add a “use” statement for this annotation?

lorant

ensuite j’ai cette erreur
Compile Error: Declaration of Oxylis\PlateformBundle\Entity\emploisRepository::findAll() must be compatible with Doctrine\Common\Persistence\ObjectRepository::findAll()

lorant

J’ai copier ton code dans le repository que j’utilise avec mon entité (emploisRepository.php) ensuite j’ai ajouter la route :
app_products_list:
path: /article/list/{page}
defaults: { _controller: OxylisPlateformBundle:Emplois:productsList, page: 1 }

J’ai créé seulement dans mon controlleur ta fonction productsListAction(…)
Bien sur j’ai adapté mon getRepository à mon bundle.

lorant

Faut il ajouter dans le config.yml quelques choses ?

lorant

Super cela semble fonctionner.bien sur il faut changer le chiffre d’affichage de $max dans le repository et $page du controller au niveau de findAll() de $productsList fr ‘pages_count’.
Merci à toi

lorant

Bonjour,
Après observation j’ai un petit problème. Il n’y a pas de point de suspension dans la pagination. La pagination contient par exemple 5 page pour 3 emploi affiché puis lorsque je clique sur suivant ou la page 2 il y a une page qui s’ajoute donc 6. Ensuite si j’augmente de page cela s’ajoute jusque 8 pages…

lorant

Il manque le nom de la fonction findAll() dans le repository 😉

Chancelvie

Bonjour,

Merci beaucoup pour ce tutoriel.
Néanmoins, j’ai un petit problème: Ma variable ” Pagination ” n’est pas reconnu dans ma vue, pourtant il est bien déclaré dans la fonction de mon contrôleur. :/
Avez-vous une idée de ce que ça peut être?

Chancelvie

Désolée, je me trompée de contrôleur. Du coup, pour la variable “Pagination” le problème est résolue.
Cependant, les différentes pages m’affichent le même résultat.
Par exemple, la page 1 et la page 2 m’affichent les 2 premiers enregistrements, tant dis qu’il y a 4 enregistrements dans ma table. :/
(le 2 est choisit exprès, selon le nombre de résultats que je souhaite qu’il m’affiche par page).

DIARRA

Bonjour,J’ai le même problème que Chancelvie, toutes mes pages affichent la même chose. J’ai besoin d’aide.