PHP中的分页 - 如何正确地完成?

时间:2016-06-19 00:22:16

标签: php pagination

我想创建一个页面导航,其中包含当前页面和4个最近的现有页面的按钮。以下是一些例子。

  • 如果当前页面为5,则应向用户显示第3,4,5,6,7页的按钮。
  • 如果当前页面为1 - 1,2,3,4,5
  • 如果当前页面为8但只有9页--5,6,7,8,9

我希望你明白这个主意。可以使用以下变量:

  • $ FIRSTPAGE
  • $ |上一页
  • $当前页
  • $下一页
  • $末页

你会怎么做?或者是否有更好的逻辑可用于在导航中显示按钮的页面?

2 个答案:

答案 0 :(得分:2)

我已经完成了自己的Paginator课程,它是用英语写的,但评论是西班牙语。

它非常易于使用。构造函数需要列出的元素总数,当前页面,每页元素限制以及您所在的部分(按部分我的意思是,如果您按部分进行分页)。

所以,如果你必须分页100个项目(每页10个项目),在"汽车"部分,你在第一页,你这样做:

$paginator = new Paginador(100, 1, 10, "Cars");
echo $paginator->procesarHTML();

这将回应HTML。要更改HTML格式化修改procesarHTML()。因此,您将获得每个页面的按钮(<a href="/SECTION/PAGE/#pagina">PAGE</a>)。当前页面将附加一个css类,以便让用户知道它在哪个页面中。

请记住编辑类变量$_secciones。添加您允许去的部分。

<?php

/*------------------------------------------------------------------
-- Descripcion: Clase para Paginar con la Clase Template HTML.
-- Version: v 1.1.0 | Ultima version: v 1.0.0
-- Ultima Edicion: 23/05/2016 08:41
--------------------------------------------------------------------
-- Autor: Matias Hernan Lauriti | matiaslauriti@gmail.com
-- Fecha Creacion: 25/05/2014
--------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-------------------------------- CSS -------------------------------

    #paginador{ margin-bottom: 5px; }

    #paginador ol{ text-align: center; }

    #paginador ol li{
        margin-top: 8px;
        display: inline-block;
        font-family: Arial;
    }

    #paginador ol li a{
        height: 24px;
        background-color: #454648;
        background-image: linear-gradient(#454648,#2F2F31);
        background-image: -webkit-linear-gradient(#454648,#2F2F31);
        background-image: -moz-linear-gradient(top,#454648,#2F2F31);
        background-image: -o-linear-gradient(top,#454648,#2F2F31);
        background-image: -ms-linear-gradient(top,#454648,#2F2F31);
        box-shadow: 0 2px 5px 0px #000, 0px 1px 0px 0px #5B5C5D inset;
        padding: 3px 8px;
        border-radius: 3px;
        font-size: 12px;
    }

    #paginador ol li a:hover{
        background-color: #FBB92C;
        background-image: linear-gradient(#FBB92C,#D49B29);
        background-image: -webkit-linear-gradient(#FBB92C,#D49B29);
        background-image: -moz-linear-gradient(top,#FBB92C,#D49B29);
        background-image: -o-linear-gradient(top,#FBB92C,#D49B29);
        background-image: -ms-linear-gradient(top,#FBB92C,#D49B29);
        box-shadow: 0 2px 5px 0px #000, 0px 1px 0px 0px #EECF91 inset;
    }

    #paginador ol li a:active{
        background-color: #454648;
        background-image: linear-gradient(#454648,#2F2F31);
        background-image: -webkit-linear-gradient(#454648,#2F2F31);
        background-image: -moz-linear-gradient(top,#454648,#2F2F31);
        background-image: -o-linear-gradient(top,#454648,#2F2F31);
        background-image: -ms-linear-gradient(top,#454648,#2F2F31);
        box-shadow: 0px 0px 1px 0px #262626 inset, 0 -1px 1px 0 #000;
    }

    #paginador ol li a.seleccionado{
        background-color: #272728;
        background-image: linear-gradient(#272728,#2F2F31);
        background-image: -webkit-linear-gradient(#272728,#2F2F31);
        background-image: -moz-linear-gradient(top,#272728,#2F2F31);
        background-image: -o-linear-gradient(top,#272728,#2F2F31);
        background-image: -ms-linear-gradient(top,#272728,#2F2F31);
        box-shadow: 0px 0px 1px 0px #262626 inset, 0 -1px 1px 0 #000;
    }

---------------------------- Utilización ---------------------------

    $paginador = new Paginador($row['total'], PAGINA, 10, SECCION);

    echo $paginador->procesarHTML();

--------------------------------------------------------------------*/

class Paginador {

    /* Variables */

    private $_total = 1;
    private $_paginaActual = 1;
    private $_limitePorPagina = 10;

    private $_paginasTotales = 1;

    private $_seccion = 'noticias'; // Seccion Default
    private $_secciones = array('noticias','videos'); // Secciones que tomo como validas desde 1 hasta n

    /* Metodos */

    public function __construct($total = 1, $paginaActual = 1, $limitePorPagina = 10, $seccion = NULL) {

        $this->_setTotal($total); // Total de elementos a listar

        $this->_setPaginaActual($paginaActual);
        $this->_setLimitePorPagina($limitePorPagina); // Limite de elementos a listar por página

        $this->_setSeccion($seccion); // Sección inicial

        $this->_procesar();

    }

    private function _setPaginaActual($pagina) {

        if(!empty($pagina) && is_numeric($pagina) && $pagina > 0) $this->_paginaActual = $pagina;

    }

    private function _setLimitePorPagina($limite) {

        if(!empty($limite) && is_numeric($limite) && $limite > 0) $this->_limitePorPagina = $limite;

    }

    private function _setTotal($total) {

        if(!empty($total) && is_numeric($total) && $total > 0) $this->_total = $total;

    }

    private function _setSeccion($seccion) {

        if(in_array($seccion,$this->_secciones)) $this->_seccion = $seccion;

    }

    private function _procesar() {

        $this->_paginasTotales = ceil( $this->_total / $this->_limitePorPagina); // Redondeo para arriba, si tengo 1.5 paginas, tengo 2 para mostrar el .5 restante

        if($this->_paginaActual > $this->_paginasTotales) $this->_paginaActual = 1;

    }

    public function getLimit($ordenAscendente = true) {

        if($ordenAscendente == true) {

            if($this->_total - ($this->_paginaActual * $this->_limitePorPagina) < 0) 
                return '0';

            return ($this->_total - ($this->_paginaActual * $this->_limitePorPagina));

        }else
            return (($this->_paginaActual - 1) * $this->_limitePorPagina);

    }

    public function procesarHTML($sufijo = '', $sig_ant = true, $prim_ult = true) {

        $paginadorHTML = NULL;

        if($this->_paginasTotales > 0) {

            $paginadorHTML = '                    <nav id="paginador">';
            $paginadorHTML .= '                        <ol>';

            if($this->_paginasTotales > 2 && $this->_paginaActual > 1 && $prim_ult == true) $paginadorHTML .= '                            <li><a href="/'.$sufijo.$this->_seccion.'/1/#pagina">&lt;&lt; Primera</a></li>';
            if($this->_paginasTotales > 1 && $this->_paginaActual > 1 && $sig_ant == true) $paginadorHTML .= '                            <li><a href="/'.$sufijo.$this->_seccion.'/'.($this->_paginaActual - 1).'/#pagina">&lt;&lt;</a></li>';

            for($i = 1; $i <= $this->_paginasTotales; $i++)
                $paginadorHTML .= '                            <li><a href="/'.$sufijo.$this->_seccion.'/'.$i.'/#pagina"'.($this->_paginaActual == $i ? ' class="seleccionado"' : '').'>'.$i.'</a></li>';

            if($this->_paginasTotales > 1 && $this->_paginaActual < $this->_paginasTotales && $sig_ant == true) $paginadorHTML .= '                            <li><a href="/'.$sufijo.$this->_seccion.'/'.($this->_paginaActual + 1).'/#pagina">&gt;&gt;</a></li>';
            if($this->_paginasTotales > 2 && $this->_paginaActual < $this->_paginasTotales && $prim_ult == true) $paginadorHTML .= '                            <li><a href="/'.$sufijo.$this->_seccion.'/'.$this->_paginasTotales.'/#pagina">Ultima &gt;&gt;</a></li>';

            $paginadorHTML .= '                        </ol>';
            $paginadorHTML .= '                    </nav>';

        }

        return $paginadorHTML;

    }

}

?>

答案 1 :(得分:1)

就像那样:

<?php

$currentPage = 5;
$lastPage = 9;
$firstPage = 1;
$between = 3;

function output($current, $limit, $between, $isAfter = false)
{
  $i = $isAfter ? $current + 1 : $current - $between;
  $max = $i + $between;

  for ($i; $i < $max; $i++)
    echo "<a href='#'>Page {$i}</a>";
}

if ($currentPage > $firstPage)
  output($currentPage, $lastPage, $between);

echo "Page {$currentPage}!";

if ($currentPage < $lastPage)
  output($currentPage, $lastPage, $between, true);