Debido a
la petición de jonni09lo paso a dejar el código del paginador tal y como lo tengo actualmente. Le he realizado algunos cambios. El código tal y como lo muestro funciona perfectamente. Más adelante le incorporaré métodos para que realice cálculos de botones de atajo (ir a la primera página, retroceder 50, 100, 1000, etc. páginas avanzar 50, 100, 1000, etc. páginas) para poder lograr un paginador lo más completo posible.
Tengo que partir el documento en dos debido a la limitación de caracteres por post.
Código PHP:
Ver original<?php
// ==========================
// = Realiza calculos para paginar resultados =
// ==========================
/*
*/
/*
* sistema que consiste en una paginación partiendo desde la pagina 0
*
* crea un array que consta de los valores para la pagina actual, valores para botones circundantes anteriores a la pagina actual,
* valores para los botones circundantes posteriores a la pagina actual,
* un valor para el boton anterior a la pagina actual y un valor para un boton posterior a la pagina actual.
*
* tambien incluye el metodo currentPages por si el developer quisiera mostrar el conjunto de resultados
* que esta utilizando el usuario.
*
* ejemplo de resultado final con la configuracion por defecto
*
* surround_before before_button page after_button surround_after total_pages current_pages
* 0 1 2 3 4 4 5 6 6 7 8 9 10 10 (a partir del registro) 500
*/
class Paginator
{
/*
* propiedades
*/
//resultados totales
private $totalResultsSet;
//numero de resultados por pagina
private $resultsPage = 10;
//numero de pagina actual
private $page;
//registro actual que esta usando el usuario
private $currentPages;
//numero de paginas totales
private $totalPages;
//numero de paginas anteriores
private $pagesBefore = 5;
//numero de pagina siguiente
private $pagesAfter = 5;
//pagina anterior
private $beforeButton;
//pagina siguiente
private $afterButton;
//botones circundantes anteriores
private $surroundBefore = array();
//botones circundantes posteriores
private $surroundAfter = array();
//resultado de un metodo
private $result = array();
// action URL, para los botones del paginador
private $url;
//identificador, identifica el objeto que esta paginando
private $id;
/*
* para crear tanto las propiedades como para iniciar los calculos basicos para toda la clase
*/
function __construct($totalResultsSet, $page, $url, $id)
{
$this->totalResultsSet = $totalResultsSet;
$this->page = $page;
$this->totalPages = $this->calcTotalPages($totalResultsSet, $this->resultsPage);
$this->currentPage = $this->currentPages($page, $this->resultsPage);
$this->url = $url;
$this->id = $id;
}
/*
* calcula las paginas totales
*/
public function calcTotalPages($totalResultsSet, $resultsPage)
{
//divide los resultados totales entre los resultados a mostrar por pagina
return $this->totalPages = ceil($totalResultsSet / $resultsPage); }
/*
* calcula el conjunto de registros que esta empleando el usuario
*/
public function currentPages($page, $resultsPage)
{
//multiplica la pagina actual por los resultados por pagina
return $this->currentPages = ceil($page * $resultsPage); }
/*
* calcula las paginas circundantes anteriores
*/
public function surroundPagesBefore()
{
//resta la pagina menos el numero de paginas anteriores en el centro
$pagesBefore = $this->page - $this->pagesBefore;
//comienza a crear botones hasta llegar a la pagina actual
for($i=$pagesBefore; $i < $this->page; $i++)
{
if($i>=0)
{
'page' =>$i,
'url' =>$this->createURL($this->url, $this->id, $i)
));
}
}
//sino retorna false para que no muestre el boton anterior
if(empty($this->surroundBefore)) {
$this->surroundBefore = FALSE;
}
return $this->surroundBefore;
}
/*
* calcula las paginas circundantes posteriores
*/
public function surroundPagesAfter()
{
//suma a la pagina actual las paginas configuradas para mostrar despues
$pagesAfter = $this->page + $this->pagesAfter;
//comienza a crear tantos botones como paginas sean posibles o menor que la suma anterior
for($i=$this->page; $i < $this->totalPages; $i++)
{
if($i>$this->page)
{
'page' =>$i,
'url' =>$this->createURL($this->url, $this->id, $i)
));
}
}
//asigna false para que no muestre botones posteriores
if(empty($this->surroundAfter)) {
$this->surroundAfter = FALSE;
}
return $this->surroundAfter;
}