Paginator
Müssen Sie eine Datenliste paginieren? Da die Mathematik hinter der Paginierung kompliziert sein kann, hilft Ihnen Nette\Utils\Paginator.
Installation:
composer require nette/utils
Erstellen wir ein Paging-Objekt und legen wir die grundlegenden Informationen dafür fest:
$paginator = new Nette\Utils\Paginator;
$paginator->setPage(1); // die Nummer der aktuellen Seite (nummeriert ab 1)
$paginator->setItemsPerPage(30); // die Anzahl der Datensätze pro Seite
$paginator->setItemCount(356); // die Gesamtzahl der Datensätze (falls verfügbar)
Die Seiten sind von 1 an nummeriert. Wir können sie mit setBase()
ändern:
$paginator->setBase(0); // nummeriert von 0
Das Objekt liefert nun alle grundlegenden Informationen, die für die Erstellung eines Paginators nützlich sind. Sie können es z. B. an eine Vorlage übergeben und dort verwenden.
$paginator->isFirst(); // ist dies die erste Seite?
$paginator->isLast(); // ist dies die letzte Seite?
$paginator->getPage(); // aktuelle Seitenzahl
$paginator->getFirstPage(); // die erste Seitennummer
$paginator->getLastPage(); // die letzte Seitenzahl
$paginator->getFirstItemOnPage(); // laufende Nummer des ersten Eintrags auf der Seite
$paginator->getLastItemOnPage(); // Laufende Nummer des letzten Eintrags auf der Seite
$paginator->getPageIndex(); // aktuelle Seitennummer, wenn von 0 an nummeriert
$paginator->getPageCount(); // die Gesamtzahl der Seiten
$paginator->getItemsPerPage(); // die Anzahl der Datensätze pro Seite
$paginator->getItemCount(); // Gesamtzahl der Datensätze (falls vorhanden)
Der Paginator wird Ihnen bei der Formulierung der SQL-Abfrage helfen. Die Methoden getLength()
und
getOffset()
geben die Werte zurück, die Sie in den LIMIT- und OFFSET-Klauseln verwenden können:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getOffset(),
);
Wenn Sie in umgekehrter Reihenfolge paginieren müssen, d.h. Seite Nr. 1 entspricht dem höchsten Offset, können Sie
getCountdownOffset()
verwenden:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getCountdownOffset(),
);
Ein Beispiel für die Verwendung in der Anwendung finden Sie im Kochbuch Paginieren von Datenbankergebnissen.