Paginator
Potřebujete stránkovat výpis dat? Protože stránkovací matematika umí být zrádná, pomůže vám s ní Nette\Utils\Paginator.
Instalace:
composer require nette/utils
Vytvoříme si objekt stránkovače a nastavíme mu základní informace:
$paginator = new Nette\Utils\Paginator;
$paginator->setPage(1); // číslo aktuální stránky
$paginator->setItemsPerPage(30); // počet položek na stránce
$paginator->setItemCount(356); // celkový počet položek, je-li znám
Stránky se číslují od 1. Můžeme to změnit pomocí setBase()
:
$paginator->setBase(0); // číslujeme od 0
Objekt nyní poskytne všechny základní informace užitečné při tvorbě stránkovače. Můžete si jej třeba předat do šablony a tam jej využít.
$paginator->isFirst(); // jsme na první stránce?
$paginator->isLast(); // jsme na poslední stránce?
$paginator->getPage(); // číslo aktuální stránky
$paginator->getFirstPage(); // číslo první stránky
$paginator->getLastPage(); // číslo poslední stránky
$paginator->getFirstItemOnPage(); // pořadové číslo první položky na stránce
$paginator->getLastItemOnPage(); // pořadové číslo poslední položky na stránce
$paginator->getPageIndex(); // číslo aktuální stránky číslované od 0
$paginator->getPageCount(); // celkový počet stránek
$paginator->getItemsPerPage(); // počet položek na stránku
$paginator->getItemCount(); // celkový počet položek, je-li znám
Stránkovač pomůže při formulování SQL dotazu. Metody getLength()
a getOffset()
vrací hodnoty,
které použijeme v klauzulích LIMIT a OFFSET:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getOffset(),
);
Pokud potřebujeme stránkovat v opačném pořadí, tj. stránka č. 1 odpovídá nejvyššímu offsetu, použijeme
getCountdownOffset()
:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getCountdownOffset(),
);
Příklad použití v aplikaci najdete v kuchařce Stránkování výsledků databáze.