Dev (Back & Front)ARTIGO

Paginação de Resultados

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!

mais conhecido como tmferreira (tmferreira@bol.com.br) e é formado em Análise de Sistemas pela Universidade Salgado de Oliveira. Trabalha desde 2005 com desenvolvimento WEB, na FatorClick (http://www.fatorclick.com.br). Também mantém um blog (http://www.tmferreira.com.br/blog/) sobre desenvolvimento WEB, onde escreve sobre PHP, Javascript, Banco de Dados e Webstandards.

Ver perfil