Paginator

Потрібно розбити вивід даних на сторінки? Оскільки математика пагінації може бути підступною, вам допоможе Nette\Utils\Paginator.

Встановлення:

composer require nette/utils

Створимо об'єкт пагінатора та встановимо йому основну інформацію:

$paginator = new Nette\Utils\Paginator;
$paginator->setPage(1); // номер поточної сторінки
$paginator->setItemsPerPage(30); // кількість елементів на сторінці
$paginator->setItemCount(356); // загальна кількість елементів, якщо відома

Сторінки нумеруються з 1. Ми можемо змінити це за допомогою setBase():

$paginator->setBase(0); // нумеруємо з 0

Об'єкт тепер надасть всю основну інформацію, корисну при створенні пагінатора. Ви можете, наприклад, передати його в шаблон і там використовувати.

$paginator->isFirst(); // ми на першій сторінці?
$paginator->isLast(); // ми на останній сторінці?
$paginator->getPage(); // номер поточної сторінки
$paginator->getFirstPage(); // номер першої сторінки
$paginator->getLastPage(); // номер останньої сторінки
$paginator->getFirstItemOnPage(); // порядковий номер першого елемента на сторінці
$paginator->getLastItemOnPage(); // порядковий номер останнього елемента на сторінці
$paginator->getPageIndex(); // номер поточної сторінки, нумерованої з 0
$paginator->getPageCount(); // загальна кількість сторінок
$paginator->getItemsPerPage(); // кількість елементів на сторінку
$paginator->getItemCount(); // загальна кількість елементів, якщо відома

Пагінатор допоможе при формулюванні SQL запиту. Методи getLength() та getOffset() повертають значення, які ми використаємо в клаузулах LIMIT та OFFSET:

$result = $database->query(
	'SELECT * FROM items LIMIT ? OFFSET ?',
	$paginator->getLength(),
	$paginator->getOffset(),
);

Якщо потрібно розбити на сторінки у зворотному порядку, тобто сторінка № 1 відповідає найбільшому зміщенню, використаємо getCountdownOffset():

$result = $database->query(
	'SELECT * FROM items LIMIT ? OFFSET ?',
	$paginator->getLength(),
	$paginator->getCountdownOffset(),
);

Приклад використання в додатку знайдете в кулінарній книзі Пагінація результатів бази даних.