Paginator
Potrzebujesz paginować zrzut danych? Ponieważ matematyka paginacji może być skomplikowana, Nette\Utils\Paginator może ci w tym pomóc.
Instalacja:
composer require nette/utils
Utwórz obiekt stronicowania i ustaw jego podstawowe informacje:
$paginator = new Nette\Utils\Paginator;
$paginator->setPage(1); // aktualny numer strony
$paginator->setItemsPerPage(30); // ilość elementów na stronie
$paginator->setItemCount(356); // całkowita liczba elementów, jeśli jest znana
Strony są numerowane od 1. Możemy to zmienić używając setBase()
:
$paginator->setBase(0); // numeracja od 0
Obiekt będzie teraz dostarczał wszystkich podstawowych informacji przydatnych podczas tworzenia strony stronicowania. Na przykład możesz przekazać go do szablonu i użyć go tam.
$paginator->isFirst(); // czy jesteśmy na pierwszej stronie?
$paginator->isLast(); // czy jesteśmy na ostatniej stronie?
$paginator->getPage(); // aktualny numer strony
$paginator->getFirstPage(); // numer pierwszej strony
$paginator->getLastPage(); // numer ostatniej strony
$paginator->getFirstItemOnPage(); // numer kolejny pierwszego elementu na stronie
$paginator->getLastItemOnPage(); // numer porządkowy ostatniego elementu na stronie
$paginator->getPageIndex(); // numer bieżącej strony numerowany od 0
$paginator->getPageCount(); // całkowita liczba stron
$paginator->getItemsPerPage(); // ilość elementów na stronie
$paginator->getItemCount(); // całkowita liczba elementów, jeśli jest znana
Konstruktor stron pomoże w formułowaniu zapytań SQL. Metody getLength()
i getOffset()
zwracają
wartości do wykorzystania w klauzulach LIMIT i OFFSET:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getOffset(),
);
Jeśli potrzebujemy paginować w odwrotnej kolejności, tzn. strona 1 odpowiada najwyższemu offsetowi, używamy
getCountdownOffset()
:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getCountdownOffset(),
);
Zobacz Database Results Pagination Cookbook, aby zobaczyć przykład, jak użyć tego w aplikacji.