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.

verze: 4.0 3.x 2.x