Foros del Web » Programando para Internet » PHP »

PHP OO Paginador: Aporte y también pido consejo para mejorarlo

Estas en el tema de Paginador: Aporte y también pido consejo para mejorarlo en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 03/01/2014, 09:09
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
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.
  #2 (permalink)  
Antiguo 03/01/2014, 09:20
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Paginador: Aporte y también pido consejo para mejorarlo

Por defecto estás asignado todos los métodos como públicos y considero de que en esa clase la podrías manejar con métodos protected y private. Una funcionalidad interesante podría ser implementar Singleton para que unicamente con una llamada al paginador, obtengas los resultados deseados:

Código PHP:
Ver original
  1. $paginador = Paginator::getInstance($totalResultsSet, $page);

Y ya $paginador tendría el array completo con las funcionalidades

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #3 (permalink)  
Antiguo 03/01/2014, 09:30
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Paginador: Aporte y también pido consejo para mejorarlo

mmm pues tienes razón! :D

voy a aplicarlo ahora mismo. gracias!!! te daría un punto pero el sistema no me deja, entre otros errores que me da desde hace tiempo :S
__________________
Ayúdame a hacerlo por mi mismo.
  #4 (permalink)  
Antiguo 03/01/2014, 09:32
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Paginador: Aporte y también pido consejo para mejorarlo

Una observación adicional (ya que no pude editar el mensaje )

Si es bueno minimizar los pasos para obtener el paginador, pero el patrón Singleton en este caso podría ser contraproducente en páginas que requieran múltiples paginadores... Se podría seguir manejando la llamada a un método estático, pero que no preserve la instancia si ya existe si no que la sobreescriba (esto ya no sería Singleton).

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #5 (permalink)  
Antiguo 03/01/2014, 09:40
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Paginador: Aporte y también pido consejo para mejorarlo

para páginas que requieran múltiples paginadores ¿no se podría iniciar y cerrar tantas instancias como se necesiten? es más, tendría que ser así, ya que cada paginación es distinta de las demás, debido sobre todo a que cada paginación tiene un result set distinto, es decir, cada paginación tiene distinto número de resultados. para ello habría que iniciar y cerrar instancia a la clase, no hay otra manera ¿no?
__________________
Ayúdame a hacerlo por mi mismo.
  #6 (permalink)  
Antiguo 03/01/2014, 10:12
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Paginador: Aporte y también pido consejo para mejorarlo

Bueno creo que eso depende de lo que quieras lograr, por ejemplo si lo que deseas que es $paginador tenga de una vez el diseño de como se vería el paginador puedes intentarlo trabajar de esta manera

Código PHP:
Ver original
  1. class Paginator
  2. {
  3.     //resto de propiedades de la clase
  4.     private static $design = '';
  5.    
  6.     private function __construct($totalResultsSet, $page){
  7.         //do stuff
  8.         self::$design = $this->getDesign();
  9.     }
  10.    
  11.     public static function getInstance($totalResultsSet, $page){
  12.         $instancia = new self($totalResultsSet, $page);
  13.         return self::$design;
  14.     }
  15.     //resto de los metodos de la clase
  16.     protected function getDesign(){
  17.         //some actions
  18.         return "<ul><li></li></ul>";
  19.     }
  20. }
  21.  
  22.  
  23. $paginador = Paginator::getInstance($totalResultsSet, $page);

En este caso $paginador tendría el diseño del paginador (es un ejemplo al vuelo, cabe aclarar)

Pero si quieres hacer mas cosas con el paginador (cosa que puede o no ser necesaria) simplemente lo sigues manejando de la misma manera (creando la instancia), pero tratando siempre de disminuir los pasos que se deben de hacer para obtener el resultado.

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #7 (permalink)  
Antiguo 03/01/2014, 10:27
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Paginador: Aporte y también pido consejo para mejorarlo

sí es cierto, creo que la manera de acceder a la clase sería según lo que necesites y pretendas lograr. por ejemplo en mi caso lo hice así porque es la mejor manera que encontré de hacerlo y es la que necesito, ya que yo no utilizo clases para imprimir/graficar los datos. otra persona que utilice clases, como parece que es tu ejemplo, sí necesitaría hacerlo de otra manera más fácil.

una persona que tuviera varias paginaciones en una misma presentación tendría que utilizar otra menera que más se adecúe a lo que necesita.

muchas gracias!! la verdad es que lo de singleton ni se me había ocurrido :D
__________________
Ayúdame a hacerlo por mi mismo.
  #8 (permalink)  
Antiguo 03/01/2014, 10:37
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Paginador: Aporte y también pido consejo para mejorarlo

Claro, pero si tu lo deseas puedes dejar definidos los métodos que trabajen con las clases y que ya dependa del usuario quien lo use si quiere usarlos o no. De esa manera considero que se volvería mas usable. Así que por defecto puedes retornar los valores, pero tengas métodos que permitan manejar el diseño del paginador.

Otra cosa adicional que puedes en cuestión del diseño (si vas a trabajarle esa parte) es permitir el manejo de como se verán los botones. Por ejemplo hay paginadores que tienen << >> como indicativos de último y primero y < > de anterior y siguiente (por poner un ejemplo).

Como ves el paginador tiene muchas funcionalidades que aún no has explorado y si quieres seguirle trabajando allí ya tienes buenos puntos en que trabajar

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #9 (permalink)  
Antiguo 07/01/2014, 17:43
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
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.
  #10 (permalink)  
Antiguo 07/01/2014, 17:44
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
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.
  #11 (permalink)  
Antiguo 07/01/2014, 17:47
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Paginador: Aporte y también pido consejo para mejorarlo

Código PHP:
Ver original
  1. /*
  2.      * crea el boton anterior
  3.      */
  4.     public  function    beforeButtons()
  5.     {
  6.         //resta 1 a la pagina actual
  7.         $pageBefore  =   ceil($this->page  -   1);
  8.        
  9.         //si el resultado anterior indica que no da un valor negativo
  10.         if($pageBefore >=0)
  11.         {
  12.             $this->beforeButton  =   array(
  13.                                                                 'page'  =>$pageBefore,
  14.                                                                 'url'      =>$this->createURL($this->url, $this->id, $pageBefore)
  15.                                                                );
  16.         }
  17.        
  18.         //sino asigna false para no mostrar boton anterior
  19.         else
  20.       {
  21.             $this->beforeButton  =   FALSE;
  22.         }
  23.      
  24.         return $this->beforeButton;
  25.     }
  26.    
  27.     /*
  28.      * crea el boton siguiente
  29.      */
  30.     public  function    afterButtons()
  31.     {  
  32.         //suma a la pagina actual 1
  33.         $afterButton    =   $this->page   +   1;
  34.        
  35.         //si el resultado anterior es menor o igual a las paginas totales posibles
  36.         if($afterButton <  $this->totalPages)
  37.         {
  38.             $this->afterButton  =   array(
  39.                                                              'page'  =>$afterButton,
  40.                                                              'url'      =>$this->createURL($this->url, $this->id, $afterButton)
  41.                                                             );
  42.         }
  43.         else
  44.         {
  45.             $this->afterButton  =   FALSE;
  46.         }
  47.        
  48.         return  $this->afterButton;
  49.     }
  50.    
  51.     /*
  52.      * crea el array definitivo con todos los valores necesarios para todos los botones
  53.      */
  54.     public  function    paginator()
  55.     {
  56.         //comprueba que la pagina que ha enviado el usuario no sea mayor que el total de resultados posibles
  57.         //tampoco que sea inferior a 0
  58.         if($this->page  <=  $this->totalPages   AND $this->page>=0)
  59.         {
  60.             $this->result   =   array(
  61.                                                         'page'=>$this->page,
  62.                                                         'surround_before'   =>$this->surroundPagesBefore(),
  63.                                                         'surround_after'    =>$this->surroundPagesAfter(),
  64.                                                         'before_button' =>$this->beforeButtons(),
  65.                                                         'after_button'  =>$this->afterButtons(),
  66.                                                         'total_pages'   =>$this->totalPages,
  67.                                                         'current_pages' =>$this->currentPages,
  68.                                                         'limit_since' =>$this->currentPages,
  69.                                                         'limit_result_set'  =>$this->resultsPage
  70.                                                     );
  71.                                                                                
  72.         }
  73.        
  74.         //si el usuario intentara romper el paginado poniendo páginas falsas entonces asigna FALSE
  75.         else
  76.       {
  77.             $this->result   =   FALSE;
  78.         }
  79.        
  80.         return  $this->result;
  81.     }
  82.  
  83.     /*
  84.      * busca y sustituye un patron dentro de una URL para
  85.      * eliminar ese patron y sustituirlo para crear una nueva URL
  86.      * evitando repetir el patron en la URL
  87.      *
  88.      * por ejemplo evitar::          ?page=1&page=2&page=3
  89.      */
  90.     public  function    createURL($url, $id, $page)
  91.     {
  92.         //si el identificador no se encuentra en la url
  93.         if(substr_count($url, $id)  ==0)
  94.         {
  95.             //agrega al final de la url el identificador y el valor que le corresponde
  96.             $url  =   $url."&".$id."=".$page;
  97.         }
  98.        
  99.         //sino busca y reemplaza el identificador en la url por su nuevo valor
  100.         else
  101.       {
  102.             $url  =   preg_replace("/(".$id."=[[:digit:]])/i", $id."=".$page, $url);
  103.         }
  104.        
  105.         return  $url;
  106.     }
  107. }
  108. ?>
__________________
Ayúdame a hacerlo por mi mismo.

Etiquetas: consejo, paginador, registro
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 22:06.