Paginador
¿Necesita paginar un listado de datos? Porque las matemáticas detrás de la paginación pueden ser complicadas, Nette\Utils\Paginator le ayudará.
Instalación:
composer require nette/utils
Vamos a crear un objeto de paginación y establecer la información básica para él:
$paginator = new Nette\Utils\Paginator;
$paginator->setPage(1); // el número de la página actual (numerada desde 1)
$paginator->setItemsPerPage(30); // el número de registros por página
$paginator->setItemCount(356); // el número total de registros (si está disponible)
Las páginas se numeran a partir de 1. Podemos cambiarla usando setBase()
:
$paginator->setBase(0); // numbered from 0
El objeto proporcionará ahora toda la información básica útil para crear un paginador. Puedes, por ejemplo, pasarlo a una plantilla y usarlo allí.
$paginator->isFirst(); // ¿es esta la primera página?
$paginator->isLast(); // ¿es ésta la última página?
$paginator->getPage(); // número de página actual
$paginator->getFirstPage(); // el número de la primera página
$paginator->getLastPage(); // el número de la última página
$paginator->getFirstItemOnPage(); // número de secuencia del primer elemento de la página
$paginator->getLastItemOnPage(); // número de secuencia del último elemento de la página
$paginator->getPageIndex(); // número de página actual si se numera desde 0
$paginator->getPageCount(); // el número total de páginas
$paginator->getItemsPerPage(); // el número de registros por página
$paginator->getItemCount(); // el número total de registros (si está disponible)
El paginador ayudará a formular la consulta SQL. Los métodos getLength()
y getOffset()
devuelven
los valores que puede utilizar en las cláusulas LIMIT y OFFSET:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getOffset(),
);
Si necesita paginar en orden inverso, es decir, la página no. 1 corresponde al desplazamiento más alto, puede utilizar
getCountdownOffset()
:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getCountdownOffset(),
);
Encontrará un ejemplo de utilización en la aplicación en el libro de recetas Paginación de los resultados de la base de datos.