Eu priorizo escrever sobre assuntos que me parecem muito utilizados pelos desenvolvedores de plantão! Hoje falarei sobre Paginação de Resultados.
Chamo de paginar resultados o processo de mostrar os resultados de uma tabela por páginas, de forma que o layout da aplicação não fique prejudicado e facilite a busca, pelo usuário.
Essa classe foi desenvolvida para PHP4 e com a utilização da classe de abstração de banco de dados, já postada.
A classe é muito simples, como deve ser. Mas quero chamar a sua atenção para uma coisa: a classe não deve “conhecer” a sua apresentação! Ou seja, a classe, para atender ao paradigma da orientação a objetos, deve poder ser reutilizável independentemente da sua aplicação.
Então, você pode notar que busquei fazer a classe de forma que ela funcione para qualquer tipo de tabela e para PHP-GTK, por exemplo.
A Classe
Você pode ver o código PHP da classe aqui. Nesse link, a classe está comentada.
Aqui vou postar a classe sem comentários, para ficar mais enchuta.
<?php
require_once( "class.bd.php" );
class Paginacao {
var $bd;
var $pagina_atual;
var $registros_por_pagina;
var $total_registros;
var $quantidade_de_paginas;
var $quantidade_de_links;
var $sql;
function Paginacao() {
$this->bd = new Bd();
$this->pagina_atual = 1;
$this->registros_por_pagina = 10;
}
function paginar() {
$bd = $this->bd;
$query = $bd->query( $this->sql );
$this->total_registros = $bd->num_rows( $query );
$this->quantidade_de_paginas = ceil( $this->total_registros / $this->registros_por_pagina );
$this->pagina_atual = ( $this->pagina_atual > $this->quantidade_de_paginas ) ? $this->quantidade_de_paginas : $this->pagina_atual;
$limite_inferior = ( $this->pagina_atual - 1 ) * $this->registros_por_pagina;
$this->sql .= " limit ".$limite_inferior.", ".$this->registros_por_pagina;
$query = $bd->query( $this->sql );
$retorno = array();
$i = 0;
while ( $linha = $bd->fetch_assoc( $query ) ) {
foreach ( $linha as $c => $v ) {
$retorno[$i][$c] = $v;
}
$i++;
}
return $retorno;
}
function exibindo() {
$max = $this->pagina_atual * $this->registros_por_pagina;
$ate = ( $max > $this->total_registros ) ? $this-> total_registros : $max;
$de = ( $this->pagina_atual == 1 ) ? 1 : ( $this->pagina_atual - 1 ) * $this->registros_por_pagina + 1;
return array( "de" => $de, "ate" => $ate, "max" => $this->total_registros );
}
function links() {
$min = 1;
$max = $this->quantidade_de_paginas;
if ( $this->quantidade_de_paginas > $this->quantidade_de_links ) {
$med = ceil( $this->quantidade_de_links / 2 );
$min = ( $this->pagina_atual - $med > 0 ) ? $this->pagina_atual - $med : 1;
$max = $min + $this->quantidade_de_links - 1;
$max = ( $max > $this->quantidade_de_paginas ) ? $this->quantidade_de_paginas : $max;
}
return array( "min" => $min, "max" => $max, "total" => $this->quantidade_de_paginas );
}
function set( $nome, $valor ) {
$this->{$nome} = $valor;
}
function get( $nome ) {
return $this->{$nome};
}
}
?>Como usar?
Vou colocar aqui um exemplo bem simples de utilização da classe: Resultado Final.
Você pode ver o código de exemplo de utilização da classe aqui.
Você pode ver que utilizei uma tabela simples, sem estilização, só para demonstrar mesmo.
Concluindo
Como vocês podem ver, nem sempre a “coisa” precisa ser complicada. Podemos (e devemos) conseguir soluções simples para problemas complexos.
Neste artigo mostrei como paginar os resultados de uma consulta SQL, de forma que a aparência da aplicação fique melhor e a experiência para o usuário seja mais positiva.
Agora, imagine utilizar essa paginação em conjunto com o script de ordenação (classificação) de tabelas que já postei aqui: Ordenação e Pesquisa em Tabelas com jQuery. O grande lance é esse! Juntar as forças para fazer as suas aplicações cada vez melhor!!
Até o próximo artigo!







