Criando um menu de paginação de resultados com algumas funcionalidades
Publicado por charles schaefer 27/10/2006
[ Hits: 6.716 ]
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.
<?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> */ ?>
Classe para gerar calendário em PHP
Saber se acesso a aplicação web é feito pela rede interna ou externa
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Alguma pessoa pode me ajudar com drriver Core i3 7020u (Debian 12)? (2)
Mikrotik não mostra bytes nem packtes (1)
Melhores Práticas de Nomenclatura: Pastas, Arquivos e Código [RESOLVID... (4)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta