<?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 = 100;
//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();
/*
* para crear tanto las propiedades como para iniciar los calculos basicos para toda la clase
*/
function __construct($totalResultsSet, $page)
{
$this->totalResultsSet = $totalResultsSet;
$this->page = $page;
$this->totalPages = $this->calcTotalPages($totalResultsSet, $this->resultsPage);
$this->currentPage = $this->currentPages($page, $this->resultsPage);
}
/*
* calcula las paginas totales
*/
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
*/
function currentPages($page, $resultsPage)
{
//multiplica la pagina actual por los resultados por pagina
return $this->currentPages = ceil($page * $resultsPage); }
/*
* calcula las paginas circundantes anteriores
*/
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)
{
}
}
//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
*/
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)
{
}
}
//asigna false para que no muestre botones posteriores
if(empty($this->surroundAfter)) {
$this->surroundAfter = FALSE;
}
return $this->surroundAfter;
}
/*
* crea el boton anterior
*/
function beforeButtons()
{
//resta 1 a la pagina actual
$pageBefore = ceil($this->page - 1);
//si el resultado anterior indica que no da un valor negativo
if($pageBefore >=0)
{
$this->beforeButton = $pageBefore;
}
//sino asigna false para no mostrar boton anterior
else
{
$this->beforeButton = FALSE;
}
return $this->beforeButton;
}
/*
* crea el boton siguiente
*/
function afterButtons()
{
//suma a la pagina actual 1
$afterButton = $this->page + 1;
//si el resultado anterior es menor o igual a las paginas totales posibles
if($afterButton <= $this->totalPages)
{
$this->afterButton = $afterButton;
}
else
{
$this->afterButton = FALSE;
}
return $this->afterButton;
}
/*
* crea el array definitivo con todos los valores necesarios para todos los botones
*/
function paginator()
{
//comprueba que la pagina que ha enviado el usuario no sea mayor que el total de resultados posibles
//tampoco que sea inferior a 0
if($this->page <= $this->totalPages AND $this->page>=0)
{
'page'=>$this->page,
'surround_before' =>$this->surroundPagesBefore(),
'surround_after' =>$this->surroundPagesAfter(),
'before_button' =>$this->beforeButtons(),
'after_button' =>$this->afterButtons(),
'total_pages' =>$this->totalPages,
'current_pages' =>$this->currentPages
)
);
}
//si el usuario intentara romper el paginado poniendo páginas falsas entonces asigna FALSE
else
{
$this->result = FALSE;
}
return $this->result;
}
}
?>