Ajouter une pagination dans votre projet Symfony 2

Ce contenu a 5 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 !

17 commentaires

  • 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?

    • Bonjour,

      Utilises tu bien les annotations pour les routes ?
      Si oui, il doit manquer le use en haut de ton controleur:

      use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

  • [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?

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

    • Cela doit être un problème de paramètres.

      La méthode findAll reçoit les paramètres $page et $max. Il faut s’assurer que dans le repository tu ai bien findAll($page, $max) et dans ton controller que tu appelles bien cette méthode avec ces paramètres:

      $productsList = $this->getDoctrine()->getRepository(‘MyBundle:Product’)->findAll($page, 30);

  • 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.

    • Utiliserais tu la méthode findAll() autre part sans paramètres?

      Et si tu modifie la fonction findAll() comme ceci:
      public function findAll($page = 1, $max = 30)

  • 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

  • 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…

  • 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?

    • 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).