Pagination des résultats de la base de données
Lors de la création d'applications web, vous rencontrerez très souvent la nécessité de limiter le nombre d'éléments affichés par page.
Nous partons d'un état où nous affichons toutes les données sans pagination. Pour sélectionner les données de la base de
données, nous avons une classe ArticleRepository
qui, en plus du constructeur, contient une méthode
findPublishedArticles
qui renvoie tous les articles publiés triés par ordre décroissant de date de
publication.
Dans le presenter, nous injectons ensuite la classe de modèle et dans la méthode render, nous demandons les articles publiés, que nous transmettons au template :
Dans le template default.latte
, nous nous occupons ensuite de l'affichage des articles :
De cette manière, nous savons afficher tous les articles, ce qui commencera cependant à poser problème lorsque le nombre d'articles augmentera. À ce moment-là, l'implémentation d'un mécanisme de pagination s'avérera utile.
Celui-ci garantira que tous les articles sont répartis sur plusieurs pages et que nous n'affichons que les articles d'une page actuelle. Le nombre total de pages et la répartition des articles seront calculés par Paginator lui-même en fonction du nombre total d'articles que nous avons et du nombre d'articles que nous voulons afficher par page.
Dans un premier temps, nous modifions la méthode d'obtention des articles dans la classe du repository afin qu'elle puisse nous renvoyer uniquement les articles d'une page. Nous ajoutons également une méthode pour connaître le nombre total d'articles dans la base de données, dont nous aurons besoin pour configurer le Paginator :
Ensuite, nous nous attaquons aux modifications du presenter. Dans la méthode render, nous transmettrons le numéro de la page actuellement affichée. Au cas où ce numéro ne ferait pas partie de l'URL, nous définirons la valeur par défaut de la première page.
Nous étendrons également la méthode render pour obtenir l'instance du Paginator, la configurer et sélectionner les bons
articles à afficher dans le template. Le HomePresenter
ressemblera à ceci après les modifications :
Le template itère désormais uniquement sur les articles d'une seule page, il nous suffit d'ajouter les liens de pagination :
Nous avons ainsi complété la page avec la possibilité de pagination à l'aide du Paginator. Dans le cas où, au lieu de Nette Database Core comme couche de base de données, nous utilisons Nette Database Explorer, nous sommes capables d'implémenter la pagination
i sans utiliser le Paginator. La classe Nette\Database\Table\Selection
contient en effet une méthode page() avec la logique de pagination
intégrée.
Le repository ressemblera à ceci avec cette méthode d'implémentation :
Dans le presenter, nous n'avons pas besoin de créer de Paginator, nous utilisons directement la méthode page()
de la classe Selection
que nous renvoie le repository :
Comme nous n'envoyons plus de Paginator au template, nous modifions la partie affichant les liens de pagination :
De cette manière, nous avons implémenté le mécanisme de pagination en utilisant la méthode page()
de Nette
Database Explorer.