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

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
  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 = 10;
  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.     // action URL, para los botones del paginador
  69.     private $url;
  70.    
  71.     //identificador, identifica el objeto que esta paginando
  72.     private    $id;
  73.    
  74.     /*
  75.      * para crear tanto las propiedades como para iniciar los calculos basicos para toda la clase
  76.      */
  77.     function    __construct($totalResultsSet, $page, $url, $id)
  78.     {
  79.         $this->totalResultsSet    =   $totalResultsSet;
  80.        
  81.         $this->page =   $page;
  82.        
  83.         $this->totalPages   =   $this->calcTotalPages($totalResultsSet, $this->resultsPage);
  84.        
  85.         $this->currentPage  =   $this->currentPages($page, $this->resultsPage);
  86.        
  87.         $this->url  =   $url;
  88.        
  89.         $this->id   =   $id;
  90.     }
  91.    
  92.     /*
  93.      * calcula las paginas totales
  94.      */
  95.     public  function    calcTotalPages($totalResultsSet, $resultsPage)
  96.     {
  97.         //divide los resultados totales entre los resultados a mostrar por pagina
  98.         return  $this->totalPages   =  ceil($totalResultsSet    /   $resultsPage);
  99.     }
  100.    
  101.     /*
  102.      * calcula el conjunto de registros que esta empleando el usuario
  103.      */
  104.     public  function    currentPages($page, $resultsPage)
  105.     {
  106.         //multiplica la pagina actual por los resultados por pagina
  107.         return  $this->currentPages  =   ceil($page   *   $resultsPage);
  108.     }
  109.    
  110.     /*
  111.      * calcula las paginas circundantes anteriores
  112.      */
  113.     public  function    surroundPagesBefore()
  114.     {  
  115.         //resta la pagina menos el numero de paginas anteriores en el centro
  116.         $pagesBefore  =   $this->page   -   $this->pagesBefore;
  117.        
  118.         //comienza a crear botones hasta llegar a la pagina actual
  119.         for($i=$pagesBefore; $i < $this->page; $i++)
  120.         {
  121.             if($i>=0)
  122.             {
  123.                 array_push($this->surroundBefore,   array(
  124.                                                                                         'page'  =>$i,
  125.                                                                                         'url'      =>$this->createURL($this->url, $this->id, $i)
  126.                                                                                         ));
  127.             }
  128.         }
  129.        
  130.         //sino retorna false para que no muestre el boton anterior
  131.         if(empty($this->surroundBefore))
  132.         {
  133.             $this->surroundBefore   =   FALSE;
  134.         }
  135.        
  136.         return  $this->surroundBefore;
  137.     }
  138.    
  139.     /*
  140.      * calcula las paginas circundantes posteriores
  141.      */
  142.     public  function    surroundPagesAfter()
  143.     {  
  144.         //suma a la pagina actual las paginas configuradas para mostrar despues
  145.         $pagesAfter  =   $this->page   +   $this->pagesAfter;
  146.        
  147.         //comienza a crear tantos botones como paginas sean posibles o menor que la suma anterior
  148.         for($i=$this->page; $i < $this->totalPages; $i++)
  149.         {
  150.             if($i>$this->page)
  151.             {
  152.                 array_push($this->surroundAfter,   array(
  153.                                                                                         'page'  =>$i,
  154.                                                                                         'url'      =>$this->createURL($this->url, $this->id, $i)
  155.                                                                                      ));
  156.             }
  157.         }
  158.        
  159.         //asigna false para que no muestre botones posteriores
  160.         if(empty($this->surroundAfter))
  161.         {
  162.             $this->surroundAfter   =   FALSE;
  163.         }
  164.        
  165.         return  $this->surroundAfter;
  166.     }
__________________
Ayúdame a hacerlo por mi mismo.