Ir para conteúdo
Fórum Script Brasil
  • 0

Classe De Paginação Com Várias Funcionalidades


charlesschaefer

Pergunta

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:

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...