Logo de islavisual
Isotipo de islavisual IslaVisual
imagen de sección

Ultima revisión 28/10/2012

Paginator: Clase para paginar resultados en PHP

Hace poco me vi en la tesitura de tener que usar paginación de resultados y decidí crear una pequeña clase que tuviese un fácil manejo y fuese portable sin hacer grandes cambios. Pues bien ahora os la dejo para quien la quiera usar.

La clase usa como fuente de datos un array y ella sola crea los enlaces y le aplica los estilos.

paginator_previo_imagen

Código de la clase


<?php
    class Paginator {
            var $select_page = 1;
            var $current_page = 1; 
            var $total_pages = 0;
            var $total_elements = 0;
            var $rows_per_page = 10;
            var $data = array();
            var $url = "";
            
            var $error101 = false;
            var $error102 = false;
            var $error101_message = '<span style="color:#a00205; font-weight:bold;">Error 101: No hay datos que paginar.</span>';
            var $error102_message = '<span style="color:#a00205; font-weight:bold;">Error 102: Error desconocido.</span>';
            
            function SelectPage($current_page, $data=""){
                if($current_page == "" || !isset($current_page)) $current_page = 1;
                $this->current_page = $current_page;
                
                if($data != "") $this->data = $data;
                if(count($this->data) == 0){ $this->error101=true; }
                
                $this->total_elements = count($this->data);
                $this->total_pages = ($this->total_elements / $this->rows_per_page);
                $this->total_pages = ceil($this->total_pages);
                $start = (($this->current_page-1) * $this->rows_per_page)-1;
                $end   = $start+$this->rows_per_page;
                
                $xCount = 0;
                $page_array = array();
                foreach ($this->data as $key => $value){
                    if($xCount > $start){
                        $page_array[$key] = $value;
                        $start++;    
                        if($start == $end) break;
                    }
                    $xCount++;
                }
                
                if(count($page_array) == 0 && !$this->error101){ $this->error101=true; }
                
                return $page_array;
            }
            
            function ShowControls($url = ""){
                if($url == "") $url = $_SERVER['PHP_SELF'];
                $this->url = $url;
                
                $res_pag1 = $this->current_page-2;
                $res_pag2 = $this->current_page-1;
                $res_pag3 = $this->current_page+1;
                $res_pag4 = $this->current_page+2;
                
                echo '<span class="paginator">'."\n";
                echo 'Página '."\n";            
                
                $union_params = "?";
                if (strpos($this->url, '?') !== false) $union_params = "&";
                
                if($this->current_page  > 1)  echo '<a id="paginator_first" href="'.$this->url.$union_params.'npg=1"></a>'."\n";    
                if($this->current_page  > 1)  echo '<a id="paginator_before" href="'.$this->url.$union_params.'npg='.($this->current_page-1).'"></a>  ';
                if($res_pag1 >= 1) echo '<a href="'.$this->url.$union_params.'npg='.($res_pag1).'">'.($res_pag1).'</a>  ';
                if($res_pag2 >= 1) echo '<a href="'.$this->url.$union_params.'npg='.($res_pag2).'">'.($res_pag2).'</a>  ';
                echo '<span>'.($this->current_page).'</span> '."\n";
                if($res_pag3 <= $this->total_pages) echo '<a href="'.$this->url.$union_params.'npg='.($res_pag3).'">'.($res_pag3).'</a>  ';
                if($res_pag4 <= $this->total_pages) echo '<a href="'.$this->url.$union_params.'npg='.($res_pag4).'">'.($res_pag4).'</a>  ';
                if($this->current_page  <  $this->total_pages) echo '<a id="paginator_next" href="'.$this->url.$union_params.'npg='.($this->current_page+1).'"></a>  ';
                if($this->current_page  <  $this->total_pages) echo '<a id="paginator_last" href="'.$this->url.$union_params.'npg='.($this->total_pages).'"></a>'."\n";
                echo '</span>'."\n";
            }
        }
>

Estilos aplicados por CSS

Los estilos los podéis cambiar en la hoja de estilos CSS vuestra. Sólo tienen que estar definidos como los siguientes:

.paginator { display: block; margin-top:20px; text-align: center; width: 100%; height:40px; clear:both }
.paginator a { background:#f0f0f0; color:#444; border:1px solid #e8e8e8; height:20px; width:20px; display:inline-block }
#paginator_first     { background:url('../images/action.first.png') no-repeat scroll 2px center #f0f0f0; }
#paginator_before    { background:url('../images/action.before.png') no-repeat scroll 2px center #f0f0f0; }
#paginator_next     { background:url('../images/action.next.png') no-repeat scroll 2px center #f0f0f0; }
#paginator_last     { background:url('../images/action.last.png') no-repeat scroll 2px center #f0f0f0; }

Las imágenes las podéis descargar pinchando aquí.

Forma de usarla

Suponiendo que tenemos un array con los resultados a paginar, para crear el array de resultados a mostrar insertaríamos las siguientes 2 líneas:

$paginator = new Paginator;
$selectFiles = $paginator->SelectPage($_GET['npg'], $array_de_resultados);

Y para insertar los controles de páginas anteriores y siguientes deberíamos escribir la siguiente línea:

$paginator->ShowControls();

Si, por ejemplo, estamos usando un blog y queremos que además filtre por categoría, deberíamos cambiar la instrucción anterior por la siguiente:

$category_param = "";
if($_GET['cat'] != "") $category_param = "?cat=".$_GET['cat'];
$paginator->ShowControls($_SERVER['PHP_SELF'].$category_param);

cat es el parámetro pasado por URL indicador de la categoría y la clase, cuando detecte que viene por parámetros algo más que el nombre del PHP, añadira el parámetro de página, si es necesario.

Además, como véis, se puede mandar la URL por parámetro y si no se envía cogerá por defecto la URL actual.

Sobre el autor

Imagen de Pablo Enrique Fernández Casado
Pablo Enrique Fernández Casado

CEO de IslaVisual, Manager, Full Stack Analyst Developer y formador por cuenta ajena con más de 25 años de experiencia en el campo de la programación y más de 10 en el campo del diseño, UX, usabilidad web y accesibilidad web. También es escritor y compositor de música, además de presentar múltiples soft kills como la escucha activa, el trabajo en equipo, la creatividad, la resiliencia o la capacidad de aprendizaje, entre otras.

Especializado en proveer soluciones integrales de bajo coste y actividades de consultoría de Usabilidad, Accesibilidad y Experiencia de Usuario (UX), además de ofrecer asesoramiento en SEO, optimización de sistemas y páginas web, entre otras habilidades.