Pido que la examinéis y me digais qué cosas están mal, qué cosas se deberían o podrían mejorar y qué cosas le implementaríais o quitaríais.
Por supuesto, cualquiera es libre de modificar el código a su gusto y utilizarlo para lo que quiera.
Por favor, absténganse de recomendar frameworks u otros medios para poder resolver la paginación, la intención de esta clase era y es aprender a resolver este problema, a-p-r-e-n-d-e-r.
Código PHP:
Ver original
<?php // ========================== // = Realiza calculos para paginar resultados = // ========================== /* * By [email protected] */ /* * 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 //botones circundantes posteriores //resultado de un metodo /* * 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 } /* * calcula el conjunto de registros que esta empleando el usuario */ function currentPages($page, $resultsPage) { //multiplica la pagina actual por los resultados por pagina } /* * 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 { $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 { $this->surroundAfter = FALSE; } return $this->surroundAfter; } /* * crea el boton anterior */ function beforeButtons() { //resta 1 a la pagina actual //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; } } ?>
Gracias por su colaboración!!! :D