Paginierung von Datenbankergebnissen
Bei der Erstellung von Webanwendungen stoßen Sie sehr oft auf die Anforderung, die Anzahl der angezeigten Elemente pro Seite zu begrenzen.
Wir gehen von einem Zustand aus, in dem wir alle Daten ohne Paginierung auflisten. Für die Auswahl der Daten aus der Datenbank
haben wir die Klasse ArticleRepository
, die neben dem Konstruktor die Methode findPublishedArticles
enthält, die alle veröffentlichten Artikel absteigend nach Veröffentlichungsdatum sortiert zurückgibt.
Im Presenter injizieren wir dann die Modellklasse und in der Render-Methode fordern wir die veröffentlichten Artikel an, die wir an das Template übergeben:
In der Vorlage default.latte
kümmern wir uns dann um die Auflistung der Artikel:
Auf diese Weise können wir alle Artikel auflisten, was jedoch Probleme verursacht, sobald die Anzahl der Artikel steigt. In diesem Moment ist die Implementierung eines Paginierungsmechanismus sinnvoll.
Dieser sorgt dafür, dass alle Artikel auf mehrere Seiten aufgeteilt werden und wir nur die Artikel der aktuellen Seite anzeigen. Die Gesamtzahl der Seiten und die Aufteilung der Artikel berechnet der Paginator selbst, basierend darauf, wie viele Artikel wir insgesamt haben und wie viele Artikel wir pro Seite anzeigen möchten.
Im ersten Schritt passen wir die Methode zum Abrufen der Artikel in der Repository-Klasse so an, dass sie uns nur Artikel für eine Seite zurückgeben kann. Wir fügen auch eine Methode hinzu, um die Gesamtzahl der Artikel in der Datenbank zu ermitteln, die wir zum Einrichten des Paginators benötigen:
Anschließend widmen wir uns den Anpassungen des Presenters. An die Render-Methode übergeben wir die Nummer der aktuell angezeigten Seite. Für den Fall, dass diese Nummer nicht Teil der URL ist, legen wir den Standardwert auf die erste Seite fest.
Weiterhin erweitern wir die Render-Methode um das Abrufen der Paginator-Instanz, deren Einrichtung und die Auswahl der
richtigen Artikel zur Anzeige im Template. Der HomePresenter
sieht nach den Anpassungen wie folgt aus:
Das Template iteriert nun bereits nur über die Artikel einer Seite, wir müssen lediglich die Paginierungslinks hinzufügen:
So haben wir die Seite um die Möglichkeit der Paginierung mit dem Paginator ergänzt. Falls wir anstelle von Nette Database Core als Datenbankschicht Nette Database Explorer verwenden, können wir die Paginierung auch ohne
Paginator implementieren. Die Klasse Nette\Database\Table\Selection
enthält nämlich die Methode page() mit der vom Paginator
übernommenen Paginierungslogik.
Das Repository sieht bei dieser Implementierungsmethode wie folgt aus:
Im Presenter müssen wir keinen Paginator erstellen, wir verwenden stattdessen die Methode der Selection
-Klasse,
die uns das Repository zurückgibt:
Da wir nun keinen Paginator an das Template senden, passen wir den Teil an, der die Paginierungslinks anzeigt:
Auf diese Weise haben wir den Paginierungsmechanismus ohne Verwendung des Paginators implementiert.