Essa classe eu fiz há pouco tempo, e queria disponibilizar pra galera, pois muitas pessoas entram em fóruns procurando classes e/ou scripts de paginação, mas quase sempre não encontram....
Essa classe gera menus com o seguinte formato:
Primeiro anterior 1 2 3 4 5 6 7 8 ... próximo Último
Prim.: Anterior 3 4 5 6 7 próximo Último
Registros 1 a 5 de 22
Você pode customizar todas as saídas da classe...
<?php
/**
SPagin is a free php class that generate a simple pagination and return a string with the links already formated.
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.
* @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;
}
}
?>
quem quiser ver um exemplo dela funcionando, sem banco de dados, com dados estáticos, tem um exemplo em:
Pergunta
charlesschaefer
Essa classe eu fiz há pouco tempo, e queria disponibilizar pra galera, pois muitas pessoas entram em fóruns procurando classes e/ou scripts de paginação, mas quase sempre não encontram....
Essa classe gera menus com o seguinte formato:
Primeiro anterior 1 2 3 4 5 6 7 8 ... próximo Último
Prim.: Anterior 3 4 5 6 7 próximo Último
Registros 1 a 5 de 22
Você pode customizar todas as saídas da classe...
quem quiser ver um exemplo dela funcionando, sem banco de dados, com dados estáticos, tem um exemplo em:
http://schaefer.myfreewebs.net
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.