Paginador
Precisa paginar a exibição de dados? Como a matemática de paginação pode ser complicada, Nette\Utils\Paginator irá ajudá-lo com isso.
Instalação:
composer require nette/utils
Criamos um objeto paginador e definimos suas informações básicas:
$paginator = new Nette\Utils\Paginator;
$paginator->setPage(1); // número da página atual
$paginator->setItemsPerPage(30); // número de itens por página
$paginator->setItemCount(356); // número total de itens, se conhecido
As páginas são numeradas a partir de 1. Podemos alterar isso usando setBase()
:
$paginator->setBase(0); // numeramos a partir de 0
O objeto agora fornecerá todas as informações básicas úteis ao criar um paginador. Você pode, por exemplo, passá-lo para um template e usá-lo lá.
$paginator->isFirst(); // estamos na primeira página?
$paginator->isLast(); // estamos na última página?
$paginator->getPage(); // número da página atual
$paginator->getFirstPage(); // número da primeira página
$paginator->getLastPage(); // número da última página
$paginator->getFirstItemOnPage(); // número de série do primeiro item na página
$paginator->getLastItemOnPage(); // número de série do último item na página
$paginator->getPageIndex(); // número da página atual numerado a partir de 0
$paginator->getPageCount(); // número total de páginas
$paginator->getItemsPerPage(); // número de itens por página
$paginator->getItemCount(); // número total de itens, se conhecido
O paginador ajuda na formulação de consultas SQL. Os métodos getLength()
e getOffset()
retornam
valores que usamos nas cláusulas LIMIT e OFFSET:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getOffset(),
);
Se precisarmos paginar na ordem inversa, ou seja, a página nº 1 corresponde ao maior offset, usamos
getCountdownOffset()
:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getCountdownOffset(),
);
Um exemplo de uso em uma aplicação pode ser encontrado no cookbook Paginação de resultados do banco de dados.