Classe para paginção
/ AGORA COM VISIBILIDADE /
/ NÃO DEPENDE DA CLASSE DE GERENCIAMENTO DO DB /
/ ADIDIONADA A VARIAVEL $EXTRA /
/ ATUALIZADA 12/08/2008 /
Ae, fiz uma classe para paginação de resultados, bem simples de usar e não exibe nenhum estilo pre-definido, assim fica facil adaptar a qualquer site.
comentem! COMENTEM!
A classe:
<?
class paginacao {
/**
* Classe de gerenciamento do banco de dados
*
* @var object
*/
protected $db;
/**
* Resultados por página
*
* @var int
*/
public $rpp = 10;
/**
* Comando SQL para pesquisar os resultados
*
* @var string
*/
public $sql = false;
/**
* Variável com os dados finais
*
* @var array
*/
public $fim = array();
/**
* Variável com total de páginas extras além da atual
*
* @var int
*/
public $extra = 3;
public function __construct() {
global $db; // pega a variável $db do escopo global
$this->db = $db; // guarda a variável $db na variável $this->db
}
public function montaPaginacao() {
if (!$this->sql) return false; // interrompe a execução se não tiver nenhuma query
$this->sql = preg_replace("'LIMIT.*'","",$this->sql); // retira o LIMIT da query case tenha
$pagina = (isset($_GET['p'])) ? intval($_GET['p']) : 1; // pega a página da URL ou define como a primeria página
$total = $this->db->sql_query($this->sql); // envia query
$total = $this->db->sql_numrows($total); // pega o total de resultados
$this->fim['mostrando'] = array($pagina*$this->rpp-$this->rpp+1,(($total < $pagina*$this->rpp) ? $total : $pagina*$this->rpp));
$this->fim['totalresultados'] = $total; // Total de resultados no banco de dados
$total = ceil($total/$this->rpp); // pega o total de páginas
$this->fim['paginaatual'] = $pagina; // Página atual
$this->fim['totalpaginas'] = $total; // Total de páginas
$limite = $pagina*$this->rpp-$this->rpp.",".$this->rpp; // define o limite de pesquisa
$this->sql .= " LIMIT $limite"; // coloca o LIMIT na query
$q = $this->db->sql_query($this->sql); // envia query
if ($this->db->sql_numrows($q) > 0) { // verifica se existe algum resultado
$this->fim['status'] = 'ok'; // coloca o status da pesquisa como ok
while ($linha = $this->db->sql_fetchrow($q)) $this->fim['resultados'][] = $linha; // coloca os valores da pesquia na variável fim
$min = $pagina-$this->extra; // coloca as 3 páginas anteriores
while ($min <= 0) $min++; // tira valores negativos e 0 das páginas anteriores
$max = $pagina+$this->extra; // coloca as 3 próximas páginas
while ($max > $total) $max--; // tira os valores que passam do total de páginas
if ($pagina > 1) { // se nao for a primeira página
$this->fim['paginas'][] = array('n' => 1, 't' => '<<'); // coloca o indicador da primeira página
$this->fim['paginas'][] = array('n' => $pagina-1, 't' => '<'); // coloca o indicador da página anterior
for ($x=$min;$x<$pagina;$x++) $this->fim['paginas'][] = array('n' => $x, 't' => $x); // coloca as 3 páginas anteriores
}
$this->fim['paginas'][] = array('n' => $pagina, 't' => 'atual'); // coloca a página final
if ($pagina < $total) { // se nao for a ultima
for ($x=$pagina+1;$x<=$max;$x++) $this->fim['paginas'][] = array('n' => $x, 't' => $x); // coloca o indicador da ultima página
$this->fim['paginas'][] = array('n' => $pagina+1, 't' => '>'); // coloca o indicador da próxima página
$this->fim['paginas'][] = array('n' => $total, 't' => '>>'); // coloca as 3 próximas páginas
}
} else {
$this->fim['status'] = 'sr'; // retorna sr se não tiver resultados
}
return $this->fim; // retorna os valores da consulta
}
}Abraços
Discussão (5)
Carregando comentários...