Jump to content
Fórum Script Brasil
  • 0

Classe De Paginação Com Várias Funcionalidades


charlesschaefer

Question

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 to comment
Share on other sites

1 answer to this question

Recommended Posts

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.1k
    • Total Posts
      651.9k
×
×
  • Create New...