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.