Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/01/2014, 09:09
Avatar de guardarmicorreo
guardarmicorreo
 
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Paginador: Aporte y también pido consejo para mejorarlo

He creado una clase para paginar resultados. Me ha llevado varios días hacerla porque he partido desde cero, ya que todos los ejemplos que he encontrado no me gustaban en la forma que solucionaban la paginación. Tenía que encontrar una manera fácil, clara y completa para paginar y este ha sido el resultado.

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
  1. <?php
  2.  
  3. //  ==========================
  4. //  = Realiza calculos para paginar resultados =
  5. //  ==========================
  6.  
  7. /*
  8.  */
  9.  
  10.  /*
  11.   * sistema que consiste en una paginación partiendo desde la pagina 0
  12.   *
  13.   * crea un array que consta de los valores para la pagina actual, valores para botones circundantes anteriores a la pagina actual,
  14.   * valores para los botones circundantes posteriores a la pagina actual,
  15.   * un valor para el boton anterior a la pagina actual y un valor para un boton posterior a la pagina actual.
  16.   *
  17.   * tambien incluye el metodo currentPages por si el developer quisiera mostrar el conjunto de resultados
  18.   * que esta utilizando el usuario.
  19.   *
  20.   * ejemplo de resultado final con la configuracion por defecto
  21.   *
  22.   *     surround_before     before_button       page       after_button     surround_after     total_pages     current_pages
  23.   *     0 1 2 3 4                 4                           5             6                       6 7 8 9 10              10                  (a partir del registro) 500
  24.   */
  25.  
  26. class Paginator
  27. {
  28.     /*
  29.      * propiedades
  30.      */
  31.      
  32.     //resultados totales
  33.     private $totalResultsSet;
  34.      
  35.     //numero de resultados por pagina
  36.     private $resultsPage = 100;
  37.      
  38.     //numero de pagina actual
  39.     private $page;
  40.    
  41.     //registro actual que esta usando el usuario
  42.     private $currentPages;
  43.    
  44.     //numero de paginas totales
  45.     private $totalPages;
  46.      
  47.     //numero de paginas anteriores
  48.     private $pagesBefore    =   5;
  49.      
  50.     //numero de pagina siguiente
  51.     private $pagesAfter =   5;
  52.    
  53.     //pagina anterior
  54.     private $beforeButton;
  55.    
  56.     //pagina siguiente
  57.     private $afterButton;
  58.    
  59.     //botones circundantes anteriores
  60.     private $surroundBefore   =   array();
  61.    
  62.     //botones circundantes posteriores
  63.     private $surroundAfter  =   array();
  64.          
  65.     //resultado de un metodo
  66.     private $result =   array();
  67.    
  68.     /*
  69.      * para crear tanto las propiedades como para iniciar los calculos basicos para toda la clase
  70.      */
  71.     function    __construct($totalResultsSet, $page)
  72.     {
  73.         $this->totalResultsSet    =   $totalResultsSet;
  74.        
  75.         $this->page =   $page;
  76.        
  77.         $this->totalPages   =   $this->calcTotalPages($totalResultsSet, $this->resultsPage);
  78.        
  79.         $this->currentPage  =   $this->currentPages($page, $this->resultsPage);
  80.     }
  81.    
  82.     /*
  83.      * calcula las paginas totales
  84.      */
  85.     function    calcTotalPages($totalResultsSet, $resultsPage)
  86.     {
  87.         //divide los resultados totales entre los resultados a mostrar por pagina
  88.         return  $this->totalPages   =  ceil($totalResultsSet    /   $resultsPage);
  89.     }
  90.    
  91.     /*
  92.      * calcula el conjunto de registros que esta empleando el usuario
  93.      */
  94.     function    currentPages($page, $resultsPage)
  95.     {
  96.         //multiplica la pagina actual por los resultados por pagina
  97.         return  $this->currentPages  =   ceil($page   *   $resultsPage);
  98.     }
  99.    
  100.     /*
  101.      * calcula las paginas circundantes anteriores
  102.      */
  103.     function    surroundPagesBefore()
  104.     {  
  105.         //resta la pagina menos el numero de paginas anteriores en el centro
  106.         $pagesBefore  =   $this->page   -   $this->pagesBefore;
  107.        
  108.         //comienza a crear botones hasta llegar a la pagina actual
  109.         for($i=$pagesBefore; $i < $this->page; $i++)
  110.         {
  111.             if($i>=0)
  112.             {
  113.                 array_push($this->surroundBefore,$i);
  114.             }
  115.         }
  116.        
  117.         //sino retorna false para que no muestre el boton anterior
  118.         if(empty($this->surroundBefore))
  119.         {
  120.             $this->surroundBefore   =   FALSE;
  121.         }
  122.        
  123.         return  $this->surroundBefore;
  124.     }
  125.    
  126.     /*
  127.      * calcula las paginas circundantes posteriores
  128.      */
  129.     function    surroundPagesAfter()
  130.     {  
  131.         //suma a la pagina actual las paginas configuradas para mostrar despues
  132.         $pagesAfter  =   $this->page   +   $this->pagesAfter;
  133.        
  134.         //comienza a crear tantos botones como paginas sean posibles o menor que la suma anterior
  135.         for($i=$this->page; $i <= $this->totalPages; $i++)
  136.         {
  137.             if($i>$this->page)
  138.             {
  139.                 array_push($this->surroundAfter,   $i);
  140.             }
  141.         }
  142.        
  143.         //asigna false para que no muestre botones posteriores
  144.         if(empty($this->surroundAfter))
  145.         {
  146.             $this->surroundAfter   =   FALSE;
  147.         }
  148.        
  149.         return  $this->surroundAfter;
  150.     }
  151.    
  152.     /*
  153.      * crea el boton anterior
  154.      */
  155.     function    beforeButtons()
  156.     {
  157.         //resta 1 a la pagina actual
  158.         $pageBefore  =   ceil($this->page  -   1);
  159.        
  160.         //si el resultado anterior indica que no da un valor negativo
  161.         if($pageBefore >=0)
  162.         {
  163.             $this->beforeButton  =   $pageBefore;
  164.         }
  165.        
  166.         //sino asigna false para no mostrar boton anterior
  167.         else
  168.       {
  169.             $this->beforeButton  =   FALSE;
  170.         }
  171.      
  172.         return $this->beforeButton;
  173.     }
  174.    
  175.     /*
  176.      * crea el boton siguiente
  177.      */
  178.     function    afterButtons()
  179.     {  
  180.         //suma a la pagina actual 1
  181.         $afterButton    =   $this->page   +   1;
  182.        
  183.         //si el resultado anterior es menor o igual a las paginas totales posibles
  184.         if($afterButton <=  $this->totalPages)
  185.         {
  186.             $this->afterButton  =   $afterButton;
  187.         }
  188.         else
  189.         {
  190.             $this->afterButton  =   FALSE;
  191.         }
  192.        
  193.         return  $this->afterButton;
  194.     }
  195.    
  196.     /*
  197.      * crea el array definitivo con todos los valores necesarios para todos los botones
  198.      */
  199.     function    paginator()
  200.     {
  201.         //comprueba que la pagina que ha enviado el usuario no sea mayor que el total de resultados posibles
  202.         //tampoco que sea inferior a 0
  203.         if($this->page  <=  $this->totalPages   AND $this->page>=0)
  204.         {
  205.             array_push($this->result, array(
  206.                                                                     'page'=>$this->page,
  207.                                                                     'surround_before'   =>$this->surroundPagesBefore(),
  208.                                                                     'surround_after'    =>$this->surroundPagesAfter(),
  209.                                                                     'before_button' =>$this->beforeButtons(),
  210.                                                                     'after_button'  =>$this->afterButtons(),
  211.                                                                     'total_pages'   =>$this->totalPages,
  212.                                                                     'current_pages' =>$this->currentPages
  213.                                                                 )
  214.                                                                                
  215.                                 );  
  216.         }
  217.        
  218.         //si el usuario intentara romper el paginado poniendo páginas falsas entonces asigna FALSE
  219.         else
  220.       {
  221.             $this->result   =   FALSE;
  222.         }
  223.        
  224.         return  $this->result;
  225.     }
  226. }
  227. ?>

Gracias por su colaboración!!! :D
__________________
Ayúdame a hacerlo por mi mismo.