<?php
/**
* Clase utilizada para paginar resultados de MySQL
* Desarrolada por: Iván Arias
* Spam: Visita www.php-hispano.net y #php_para_torpes del iRC-Hispano
*/
class paginador {
var $tabla;
var $where;
var $enlace;
var $epp;
var $actual;
var $link;
/**
* Constructor de la clase
* @param String $tabla Tabla de la base de datos que se va a paginar
* @param String $where Clausula where del query para selccionar los datos
* @param String $enlace Direccion URL de la pagina para generar los enlaces
* @param int $epp Elementos por pagina que se mostrarán
* @param Resource $link Variable de conexion MySQL
*/
function paginador ($tabla, $where, $enlace, $epp, $link) {
$this->tabla = $tabla;
$this->where = $where;
$this->enlace = $enlace . ((strpos($enlace, "?") === false)? "?" : "&");
$this->epp = $epp;
$this->link = $link;
$pag = empty($_GET['pag'])? 0 : $_GET['pag'];
$this->actual = ($pag > ($max = $this->max_paginas())) ? $max : (($pag < 1)? 1 : $pag);
}
/**
* Retorna un array con los elementos de la pagina actual
* @return Array Elementos de la pagina actual
*/
function get_elementos() {
$inicio = ($this->actual - 1) * $this->epp;
$result = mysql_query("SELECT * FROM {$this->tabla} WHERE {$this->where} LIMIT $inicio, {$this->epp}", $this->link) or die (debug("paginador.class", "get_elementos", mysql_error()));
$array = array();
while ($row = mysql_fetch_array($result)) $array[] = $row;
return $array;
}
/**
* Retorna una cadena de texto con los enlaces formados
* @param int $rango De ser especificado, solo muestra las paginas proximas a la actual cuya distancia sea menor o igual que el rango
* @return String Cadena de texto con los enlaces formados
*/
function get_paginas($rango = 0) {
$rango = ($rango < 1) ? 0 : (($rango>5) ? 5 : $rango);
if ($rango) { $inicio = ($this->actual - $rango < 1) ? 1 : $this->actual - $rango; $fin = ($this->actual + $rango > ($max = $this->max_paginas())) ? $max : $this->actual + $rango; }
else { $inicio = 1; $fin = ($max = $this->max_paginas()); }
$return = ($this->actual != 1)? "<a href=\"{$this->enlace}pag=".($this->actual-1)."\">Anterior</a> " : "Anterior ";
if ($inicio > 1) $return .= "... ";
for ($i=$inicio; $i<=$fin; $i++) {
$return .= ($i != $this->actual)? "<a href=\"{$this->enlace}pag=$i\">$i</a> ": "$i ";
}
if ($fin < $max) $return .= " ...";
return ($this->actual != $this->max_paginas() && !$this->vacio())? $return . " <a href=\"{$this->enlace}pag=".($this->actual+1)."\">Siguiente</a>" : $return." Siguiente";
}
/**
* Metodo que retorna el numero de elementos para la consulta
* @return int Número de resultados en la tabla
*/
function num_elementos() {
$result = mysql_query("SELECT COUNT(*) FROM {$this->tabla} WHERE {$this->where}", $this->link) or die (debug("paginador.class", "num_elementos", mysql_error()));
return mysql_result($result, 0);
}
/**
* Numero total de paginas
* @return int Numero total de paginas
*/
function max_paginas() {
return ($max = ceil($this->num_elementos() / $this->epp))? $max : 1;
}
/**
* Indica si hay elementos o no
* @return boolean Retorna true si hay elementos para paginar, false en cualkier otro caso
*/
function vacio() {
return $this->num_elementos() == 0;
}
}
?>