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.
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.