Paginator
Müssen Sie die Ausgabe von Daten paginieren? Da die Paginierungsmathematik knifflig sein kann, hilft Ihnen Nette\Utils\Paginator dabei.
Installation:
composer require nette/utils
Wir erstellen ein Paginator-Objekt und legen die grundlegenden Informationen fest:
$paginator = new Nette\Utils\Paginator;
$paginator->setPage(1); // Nummer der aktuellen Seite
$paginator->setItemsPerPage(30); // Anzahl der Elemente pro Seite
$paginator->setItemCount(356); // Gesamtzahl der Elemente, falls bekannt
Die Seiten werden ab 1 nummeriert. Dies können wir mit setBase()
ändern:
$paginator->setBase(0); // wir nummerieren ab 0
Das Objekt liefert nun alle grundlegenden Informationen, die bei der Erstellung eines Paginators nützlich sind. Sie können es z.B. an eine Vorlage übergeben und dort verwenden.
$paginator->isFirst(); // sind wir auf der ersten Seite?
$paginator->isLast(); // sind wir auf der letzten Seite?
$paginator->getPage(); // Nummer der aktuellen Seite
$paginator->getFirstPage(); // Nummer der ersten Seite
$paginator->getLastPage(); // Nummer der letzten Seite
$paginator->getFirstItemOnPage(); // Ordnungszahl des ersten Elements auf der Seite
$paginator->getLastItemOnPage(); // Ordnungszahl des letzten Elements auf der Seite
$paginator->getPageIndex(); // Nummer der aktuellen Seite, nummeriert ab 0
$paginator->getPageCount(); // Gesamtzahl der Seiten
$paginator->getItemsPerPage(); // Anzahl der Elemente pro Seite
$paginator->getItemCount(); // Gesamtzahl der Elemente, falls bekannt
Der Paginator hilft bei der Formulierung von SQL-Abfragen. Die Methoden getLength()
und getOffset()
geben Werte zurück, die wir in den Klauseln LIMIT und OFFSET verwenden:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getOffset(),
);
Wenn wir in umgekehrter Reihenfolge paginieren müssen, d.h. Seite Nr. 1 entspricht dem höchsten Offset, verwenden wir
getCountdownOffset()
:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getCountdownOffset(),
);
Ein Anwendungsbeispiel finden Sie im Kochbuch Paginierung von Datenbankergebnissen.