Criando um menu de paginação de resultados com algumas funcionalidades

Publicado por charles schaefer 27/10/2006

[ Hits: 6.714 ]

Download SPagin.php




Essa é uma classe que vai criar uma paginação de resultados para os valores que você passar.

Você pode customizar como o resultado será apresentado, indicando dentro de qual tag ele deve ser incluído, qual caractere separará cada número na paginação; se o menu será infinito (1 2 3 4 5 6 7...) ou com números limitados (|< <<1 2 3 4 5 >> >|), etc.

Você ainda pode ter uma paginação inteligente, que diz em qual registro de um total você está (reg.: 10 a 15 de 50), sendo essa mensagem customizável também.

  



Esconder código-fonte

<?php
/**
SPagin é uma classe php simples, que gera um menu de paginação formatado, com a saída customizável.
Copyright (C) 2006 Charles Schaefer

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

/**
* Classe que gera a paginação com limite de exibição de resutlados. Essa classe pode ser usada com dados arbitrários ou vindos do banco de dados
* @copyright Charles Schaefer - 2006
*
*/
class SPagin{
var $regs,$exNum,$url,$totReg,$totPag,$pg;
var $separador,$tag_pagin,$url_separator;
/**
* @desc Método construtor da classe
*
* @param string $regs numero de registro por página
* @param string $url endereço da página onde contêm a paginação
* @param integer $totReg total de registros contidos no Banco de Dados
* @param integer $pg em qual páina estamos
* @param integer $exNum nmero de páginas a ser exibida na paginação ex.: exNum =5 (<< < 1 2 3 4 5 > >>)
* @param string $separador padrão de separação dos links
* @param string $tag_pagin tag na qual será inserida a paginação
* @return none
*/
function SPagin($regs,$url,$totReg,$pg,$exNum=\"\",$separador=\' | \',$tag_pagin=\"\"){
$this->regs = $regs;
$this->exNum = $exNum;//essa variável deve ser usada para criar uma forma de exibir apenas a quantidade de numeros pedida
$this->url = $url;
$this->totReg = $totReg;
$totPag = $totReg<=$regs ? 1 : ceil($totReg/$regs);
$this->totPag = $totPag;
$this->pg = ($pg != \"\") ? $pg : 1;
$this->separador = $separador != \"\" ? $separador : \" | \";
$this->tag_pagin = $tag_pagin;
$this->url_separator = (strpos($url,\"?\") !== false) ? \"&\" : \"?\";
}

/**
* @desc mêtodo que irá definir os argumentos para serem repassados no \"limit\", quando se estiver utilizando um banco de dados
* @return string limit formatado para usar como cláusula no sql
*/
function limit(){
$inicio = ($this->pg * $this->regs) - $this->regs;//o primeiro registro a ser puxado do BD
$final = $this->regs;//o último a ser puxado do BD
$limit = $inicio.\",\".$final;
return $limit;
}


/**
* @desc página que vai devolver o resultado da paginação
*
* @param string $primeiro o que usar na paginação com inicador de primeiro
* @param string $ultimo o que usar na paginação com inicador de ultimo
* @param string $prev o que usar na paginação com inicador de próximo
* @param string $next o que usar na paginação com inicador de anterior
* @return string menu formatado, pronto para ser exibido na tela
*/
function paginar($primeiro=\"<<\",$ultimo=\">>\",$prev=\"<\",$next=\">\"){
$pg = $this->pg;
$totPag = $this->totPag;
$url = $this->url;
$tag_pagin = $this->tag_pagin;
$url_separator = $this->url_separator;

$primeiro = $primeiro == \"\" ? \"<<\" : $primeiro;
$ultimo = $ultimo == \"\" ? \">>\" : $ultimo;
$prev = $prev == \"\" ? \"<\" : $prev;
$next = $next == \"\" ? \">\" : $next;

if($totPag == $pg)
{
$pg = $this->pg - 1;
$proximo = $next.\" \";
$ultima = $ultimo;
$anterior = \"<a href=\\\"\".$url.$url_separator.\"pg=$pg\\\"> \".$prev.\"</a> \";
$primeira = \"<a href=\\\"\".$url.$url_separator.\"pg=1\\\">\".$primeiro.\"</a>\";
}elseif($pg == 1)
{
$pg = $this->pg + 1;
$proximo = \"<a href=\\\"\".$url.$url_separator.\"pg=$pg\\\">\".$next.\" </a>\";
$anterior = \" \".$prev.\" \";
$primeira = $primeiro;
$ultima = \"<a href=\\\"\".$url.$url_separator.\"pg=$totPag\\\">\".$ultimo.\"</a>\";
}else
{
$pg_p = $pg + 1;
$pg_a = $pg - 1;
$proximo = \"<a href=\\\"\".$url.$url_separator.\"pg=$pg_p\\\">\".$next.\" </a>\";
$anterior = \"<a href=\\\"\".$url.$url_separator.\"pg=$pg_a\\\"> \".$prev.\"</a> \";
$primeira = \"<a href=\\\"\".$url.$url_separator.\"pg=1\\\">\".$primeiro.\"<a/>\";
$ultima = \"<a href=\\\"\".$url.$url_separator.\"pg=$totPag\\\">\".$ultimo.\"</a>\";
}
$pagina = \"<p>\".$primeira.$anterior;

if($this->exNum != \"\")
{
$exNum = $this->exNum;
$pagina .= $this->paginar_limitado($exNum,$totPag);

}else
{
for($i=1;$i<=$totPag;$i++)
{
if($i == $this->pg)
{
$pagina .= \"<b>\".$i.\"</b> | \";
} else
{
$pagina .= \"<a href=\\\"\".$url.$url_separator.\"pg=\".$i.\"\\\">\".$i.\"</a> | \";
}
}//close for
}
$pagina .= $proximo.$ultima.\"</p>\";
if($totPag == 1)
{
$result = \"<span style=\\\"visibility: hidden\\\">\".$pagina.\"</span>\";
}elseif ($tag_pagin != \"\")
{
$result = str_replace(\"><\",\">\".$pagina.\"<\",$tag_pagin);
}else
{
$result = $pagina;
}
return $result;
}//close function

/**
* @desc Função que irá criar um menu de navegação de páginas com limite de itens (no menu) ex.: << < 1 2 3 4 5 > >>
*
* @param integer $exNum
* @param integer $totalPg
* @return string menu formatado
*/
function paginar_limitado($exNum,$totalPg)
{
$url = $this->url;
$url_separator = $this->url_separator;
$separador = $this->separador;
$pg = $this->pg;
$div = (is_int($exNum/2)) ? $exNum/2 : floor($exNum/2);
$centro = (is_int($exNum/2)) ? $exNum/2 : ceil($exNum/2);
if($pg == $totalPg)
{
if($totalPg >= $exNum)
{
$termina = $totalPg;
$comeco = $termina - $exNum +1;
$i =$comeco;
while($i>=$comeco and $i<=$termina)
{
$menu .= ($i == $pg) ? \"<b>\".$i.\"</b>$separador\" : \"<a href=\\\"\".$url.$url_separator.\"pg=\".$i.\"\\\">\".$i.\"</a>$separador\";
$i++;
}
}else
{
$comeco = 1;
$termina = $totalPg;
$i = $comeco;
while($i>=$comeco and $i<=$termina)
{
$menu .= ($i == $pg) ? \"<b>\".$i.\"</b>$separador\" : \"<a href=\\\"\".$url.$url_separator.\"pg=\".$i.\"\\\">\".$i.\"</a>$separador\";
$i++;
}
}
}elseif ($pg == 1)
{
$comeco = 1;
$termina = $totalPg >= $exNum ? ($comeco + $exNum) -1 : $totalPg;
$i = $comeco;
//echo $i.\" \".$termina.\" \".$exNum.\" \".$this->exNum;

while($i <= $termina and $i >= $comeco)
{
$menu .= ($i == $pg) ? \"<b>\".$i.\"</b>$separador\" : \"<a href=\\\"\".$url.$url_separator.\"pg=\".$i.\"\\\">\".$i.\"</a>$separador\";
$i++;
}

}elseif ($pg < $totalPg - $exNum)
{
if($pg > $exNum)
{
$comeco = $pg - $div;
$termina = $comeco + $exNum - 1;
$i = $comeco;
while ($i <= $termina and $i >= $comeco)
{
$menu .= ($i == $pg) ? \"<b>\".$i.\"</b>$separador\" : \"<a href=\\\"\".$url.$url_separator.\"pg=\".$i.\"\\\">\".$i.\"</a>$separador\";
$i++;
}
}elseif ($pg < $exNum)
{
if($pg > $centro)
{
$comeco = $pg - $div;
$termina = $comeco + $exNum - 1;
$i = $comeco;
while($i <= $termina and $i >= $comeco)
{
$menu .= ($i == $pg) ? \"<b>\".$i.\"</b>$separador\" : \"<a href=\\\"\".$url.$url_separator.\"pg=\".$i.\"\\\">\".$i.\"</a>$separador\";
$i++;
}
}else
{
$comeco = 1;
$termina = $comeco + $exNum - 1;
$i = $comeco;
while($i <= $termina and $i >= $comeco)
{
$menu .= ($i == $pg) ? \"<b>\".$i.\"</b>$separador\" : \"<a href=\\\"\".$url.$url_separator.\"pg=\".$i.\"\\\">\".$i.\"</a>$separador\";
$i++;
}
}
}elseif ($pg == $exNum)
{

$comeco = $exNum - $div;
$termina = $comeco + $exNum -1;
$i = $comeco;
while ($i >= $comeco and $i <= $termina)
{
$menu .= ($i == $pg) ? \"<b>\".$i.\"</b>$separador\" : \"<a href=\\\"\".$url.$url_separator.\"pg=\".$i.\"\\\">\".$i.\"</a>$separador\";
$i++;
}
}
}elseif ($pg > $totalPg - $exNum){
if($totalPg > $exNum)
{
//$comeco = $totalPg - $exNum;
//$termina = $comeco + $exNum - 1;
if($pg <= $totalPg - ($exNum - $centro))
{
$comeco = $pg - $div;
$termina = $comeco + $exNum - 1;
$i = $comeco;
while ($i >= $comeco and $i <= $termina)
{
$menu .= ($i == $pg) ? \"<b>\".$i.\"</b>$separador\" : \"<a href=\\\"\".$url.$url_separator.\"pg=\".$i.\"\\\">\".$i.\"</a>$separador\";
$i++;
}
}else
{
$comeco = $totalPg - $exNum + 1;
$termina = $comeco + $exNum - 1;
$i = $comeco;
while ($i >= $comeco and $i <= $termina)
{
$menu .= ($i == $pg) ? \"<b>\".$i.\"</b>$separador\" : \"<a href=\\\"\".$url.$url_separator.\"pg=\".$i.\"\\\">\".$i.\"</a>$separador\";
$i++;
}
}
}elseif ($totalPg <= $exNum)
{
$comeco = 1;
$termina = $totalPg;
$i = $comeco;
while ($i <= $termina and $i >= $comeco)
{
$menu .= ($i == $pg) ? \"<b>\".$i.\"</b>$separador\" : \"<a href=\\\"\".$url.$url_separator.\"pg=\".$i.\"\\\">\".$i.\"</a>$separador\";
$i++;
}
}
}elseif ($pg == $totalPg - $exNum)
{
$div = floor($exNum / 2);
$termina = $totalPg - ($exNum - $div);
$comeco = $termina - $exNum + 1;
$i = $comeco;
while ($i <= $termina and $i >= $comeco)
{
$menu .= ($i == $pg) ? \"<b>\".$i.\"</b>$separador\" : \"<a href=\\\"\".$url.$url_separator.\"pg=\".$i.\"\\\">\".$i.\"</a>$separador\";
$i++;
}
}
//die($menu);

$menu = rtrim($menu,$separador).\" \";
return $menu;
}//close function

/**
* @desc função que gera a paginação inteligente, no formato item y a x de n
*
* @param string $template deve estar no formato \"blabla #1 blabla #2 blabla #3 blabalbalbal\" sendo que #1,#2,#3 são inicio, final, total, respectivamente. Ex.: item #1 a #2 de #3 ficara \"item 10 a 20 de 45\"
* @return string menu formatado
*/
function paginar_inteligente($template=\"\")
{
$menu = \"\";
$de = $this->pg * $this->exNum - $this->exNum + 1;
$a = $this->pg * $this->exNum;
$total = $this->totReg;
if(!empty($template))
{
$tpl = substr_replace(substr_replace(substr_replace($template,$total,strpos($template,\"#3\"),2),$a,strpos($template,\"#2\"),2),$de,strpos($template,\"#1\"),2);

$menu = $tpl;
}else
{
$menu = \"Itens \".$de.\" a \".$a.\" de \".$total;
}
return $menu;
}
}

?>

<?php
//exemplo de uso da classe
$pagin = new SPagin(5,$_SERVER['PHP_SELF'],200,$_GET['pagina_atual'],5);

//a ser usada na query como parâmetro limit
$limit = $pagin->limit();

echo $pagin->paginacao();
/* Saída do exemplo:

<< < 1 | <a href="teste.php?pg=2">2</a> | <a href="teste.php?pg=3">3</a> | <a href="teste.php?pg=4">4</a> <a href="teste.php?pg=5">5</a> <a href="teste.php?pg=2">></a> <a href="teste.php?pg=40">>></a>

*/
?>

Scripts recomendados

Formatar CPF e CNPJ para formato user friendly

Componente datepicker

Transformar datas para gravar no banco de dados (MySQL, Postgres e outros)

Descobrir qual SO o usuário que está acessando o seu site/software está utilizando

Página inicial com dados e agenda com AJAX e MySQL


  

Comentários
[1] Comentário enviado por fabio em 27/10/2006 - 10:13h

Ficou do caramba a classe, meus parabéns!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts