Paginator
*********
.[perex]
Potřebujete stránkovat výpis dat? Protože stránkovací matematika umí být zrádná, pomůže vám s ní [api:Nette\Utils\Paginator].
Instalace:
```shell
composer require nette/utils
```
Vytvoříme si objekt stránkovače a nastavíme mu základní informace:
```php
$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()`:
```php
$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.
```php
$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->getBase(); // základ číslování stránek (výchozí 1)
$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:
```php
$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()`:
```php
$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 |best-practices:pagination].
{{maintitle: Stránkování v PHP s Nette Utils Paginator}}
{{description: Stránkovací matematika umí být zrádná. Paginator spočítá počet stránek, aktuální stránku, offset i limit pro vaše výpisy dat. Včetně příkladu s databází.}}
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->getBase(); // základ číslování stránek (výchozí 1)
$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.