PHP Classes

File: paginacao.php

Recommend this page to a friend!
  Classes of Gilberto Albino   PDO Pagination   paginacao.php   Download  
File: paginacao.php
Role: Class source
Content type: text/plain
Description: This file contains the class for pagination and test case
Class: PDO Pagination
Display query results split in pages using PDO
Author: By
Last change: Verificação se o paginador existe
Check if the paginator is set
Date: 14 years ago
Size: 6,481 bytes
 

Contents

Class file image Download
<?php
/*
 * Author Gilberto Albino <http://www.gilbertoalbino.com>
 * License None
 * Date 2009-03-1
 */
/*
 * Pedimos para o PHP mostrar os erros, caso esteja desativado
 */
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors', 1);
/*
 * Constantes usadas pela classe de conexão, poderia estar num arquivo externo.
 */
 // o dsn é a string para conexão com o PDO que pode variar de banco para banco
 // Por isto, preste atenção que nesta string temos o driver, o host e o banco(dbname)
defined('DSN') or define('DSN', 'mysql:host=localhost;dbname=teste');
defined('USUARIO') or define('USUARIO', 'root');
defined('SENHA') or define('SENHA', '');

echo
'<h1>Paginação PDO</h1>';


/*
 * Classe para paginação em PDO
 */
class Paginacao_PDO
{
    public
$paginador = 'pag';
    private
$solicitador;
    public
$sql;
    public
$limite = 10;
    public
$quantidade = 5;
   
   
// Construtor carrega a string usada para como paginador
   
public function __construct()
    {
       
$this->solicitador = ( isset ($_REQUEST["{$this->paginador}"]) )
                                   ?
$_REQUEST["{$this->paginador}"]
                                   :
0 ;
    }
   
// Conexão privada
   
private function conexao()
    {
       
$conexao = new Conexao();
       
$con = $conexao->conexao;
        return
$con;
    }
   
// Retorna o número de resultados encontrados
   
public function resultado()
    {
       
$this->resultado = $this->conexao()->query(str_replace('*', 'COUNT(*)', $this->sql));
       
$this->numeroResultados = $this->resultado->fetchColumn();
        return
$this->numeroResultados;
    }
   
// Imprime um texto amigável mostrando o status das paginas em relação ao resultado atual
   
public function imprimeBarraResultados()
    {
        if(
$this->resultado() > 0) {
            echo
'<p class="info_resultado_busca">';
            echo
'Exibindo página <b style="font-size:20px">' . $this->paginaAtual() . '</b> de <b style="font-size:20px">' . $this->paginasTotais() . '</b> disponíveis para <b style="font-size:20px">'.$this->resultado().'</b> resultados encontrados.</p>';
        } else {
            echo
'<p class="info_resultado_busca">Não foram encontrados resultados para sua busca.</p>';
        }
    }
   
// Calcula o número total de páginas
   
public function paginasTotais()
    {
       
$paginasTotais = ceil($this->resultado() / $this->limite);
        return
$paginasTotais;
    }
   
// Procura o número da página Atual
   
public function paginaAtual()
    {
        if (isset(
$this->solicitador) && is_numeric($this->solicitador)) {
           
$this->paginaAtual = (int) $this->solicitador;
        } else {
           
$this->paginaAtual = 1;
        }

        if (
$this->paginaAtual > $this->paginasTotais()) {
           
$this->paginaAtual = $this->paginasTotais();
        }

        if (
$this->paginaAtual < 1) {
           
$this->paginaAtual = 1;
        }

        return
$this->paginaAtual;
       
    }
   
// Calcula o offset da consulta
   
private function offset()
    {
       
$offset = ($this->paginaAtual() - 1) * $this->limite;
        return
$offset;
    }
   
// Retorna o SQL para trabalhar posteriormente
   
public function sql()
    {
       
$sql = $this->sql . " LIMIT {$this->limite} OFFSET {$this->offset()} ";
        return
$sql;
    }
   
// Imprime a barra de navegação da paginaçaõ
   
public function imprimeBarraNavegacao()
    {
        if(
$this->resultado() > 0) {
            echo
'<div id="navegacao_busca">';
            if (
$this->paginaAtual() > 1) {
                echo
" <a href='?" . $this->paginador . "=1" . $this->reconstruiQueryString($this->paginador) . "'>Primeira</a> ";
               
$anterior = $this->paginaAtual() - 1;
                echo
" <a href='?" . $this->paginador . "=" . $anterior . $this->reconstruiQueryString($this->paginador) . "'>Anterior</a> ";
            }
           
            for (
$x = ($this->paginaAtual() - $this->quantidade); $x < (($this->paginaAtual() + $this->quantidade) + 1); $x++) {
                if ((
$x > 0) && ($x <= $this->paginasTotais())) {
                    if (
$x == $this->paginaAtual()) {
                        echo
" [<b>$x</b>] ";
                    } else {
                        echo
" <a href='?" . $this->paginador . "=" . $x . $this->reconstruiQueryString($this->paginador) . "'>$x</a> ";
                    }
                }
            }
           
            if (
$this->paginaAtual() != $this->paginasTotais()) {
               
$paginaProxima = $this->paginaAtual() + 1;
                echo
" <a href='?" . $this->paginador . "=" . $paginaProxima . $this->reconstruiQueryString($this->paginador) . "'>Próxima</a> ";
                echo
" <a href='?" . $this->paginador . "=" . $this->paginasTotais() . $this->reconstruiQueryString($this->paginador) . "'>Última</a> ";
            }
           
            echo
'</div>';
        }
    }
   
// Monta os valores da Query String novamente
   
public function reconstruiQueryString($valoresQueryString) {
        if (!empty(
$_SERVER['QUERY_STRING'])) {
           
$partes = explode("&", $_SERVER['QUERY_STRING']);
           
$novasPartes = array();
            foreach (
$partes as $val) {
                if (
stristr($val, $valoresQueryString) == false) {
                   
array_push($novasPartes, $val);
                }
            }
            if (
count($novasPartes) != 0) {
               
$queryString = "&".implode("&", $novasPartes);
            } else {
                return
false;
            }
            return
$queryString; // nova string criada
       
} else {
            return
false;
        }
    }
   
}
// Você pode criar outra forma de conexão se desejar
class Conexao
{
    private
$_usuario;
    private
$_senha;
    private
$_dsn;
   
    public function
__construct()
    {
       
$this->defineUsuario(USUARIO);
       
$this->defineSenha(SENHA);
       
$this->defineDSN(DSN);
       
$this->abreConexao();
    }
   
// Define o Usuário
   
public function defineUsuario($usuario)
    {
       
$this->_usuario = $usuario;
    }
   
// Define a Senha
   
public function defineSenha($senha)
    {
       
$this->_senha = $senha;
    }
   
// Define o DSN
   
public function defineDSN($dns)
    {
       
$this->_dsn = $dns;
    }
   
// Abre a conexão sem retornar a mesma
   
public function abreConexao()
    {
       
$this->conexao = new PDO($this->_dsn, $this->_usuario, $this->_senha);
       
$this->conexao->query("SET NAMES utf8");
    }
   
// Fecha a conexao
   
public function fechaConexao()
    {
       
$this->_conexao = null;
    }
}

// Para trabalharmos externamente à classe Paginacao_PDO
$conexao = new Conexao();
$conexao = $conexao->conexao;
// Iniciamos a paginacao
$paginacao = new Paginacao_PDO();
$paginacao->sql = "select * from paises";
// Status dos Resultados
$paginacao->imprimeBarraResultados();
// A partir do método sql() de Paginacao_PDO
// Vamos listar os resultados
$res = $conexao->query($paginacao->sql());
while(
$r = $res->fetch(PDO::FETCH_OBJ)) {
    print
$r->nome . "<br />";
}
// Barra de Navegação
$paginacao->imprimeBarraNavegacao();