简体   繁体   English

PHP 中的分页 - 如何正确执行?

[英]Pagination in PHP - how to do it properly?

I want to create a page navigation that has buttons for the current page and the 4 closest existing pages.我想创建一个页面导航,其中包含当前页面和 4 个最接近的现有页面的按钮。 Here are a few examples.这里有一些例子。

  • If the current page is 5, then the user should be shown buttons for pages 3, 4, 5, 6, 7.如果当前页面是第 5 页,则应该向用户显示第 3、4、5、6、7 页的按钮。
  • If the current page is 1 - 1, 2, 3, 4, 5如果当前页面是 1 - 1, 2, 3, 4, 5
  • If the current page is 8 but there are only 9 pages - 5, 6, 7, 8, 9如果当前页是 8 但只有 9 页 - 5, 6, 7, 8, 9

I hope you get the idea.我希望你能明白。 The following variables that can be used:可以使用以下变量:

  • $firstPage $第一页
  • $previousPage $上一页
  • $currentPage $当前页
  • $nextPage $下一页
  • $lastPage $lastPage

How would you do this?你会怎么做? Or is there a better logic that can be used in regard to which pages to show buttons for in the navigation?或者是否有更好的逻辑可以用于在导航中显示哪些页面的按钮?

I have done my own Paginator class, it is in english but comments are on spanish.我已经完成了自己的分页器课程,它是英文的,但评论是西班牙文。

It's really easy to use.它真的很容易使用。 The constructor requires the total of elements to list, current page, elements limit per page, and the section you are in (by section I mean, if you are doing pagination by sections).构造函数需要列出元素的总数、当前页面、每页的元素限制以及您所在的部分(我的意思是部分,如果您按部分进行分页)。

So, if you have to paginate 100 items (10 items per page), in "Cars" section and you are on first page, you do this:因此,如果您必须在“汽车”部分对 100 个项目(每页 10 个项目)进行分页,并且您在第一页上,请执行以下操作:

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

This will echo the HTML.这将回显 HTML。 To change the HTML formated modify procesarHTML() .要更改 HTML 格式,请修改procesarHTML() So you will get buttons to each page ( <a href="/SECTION/PAGE/#pagina">PAGE</a> ).所以你会得到每个页面的按钮( <a href="/SECTION/PAGE/#pagina">PAGE</a> )。 The current page will have a css class attached to it to let the user know in what page it is.当前页面将附加一个 css 类,以让用户知道它位于哪个页面。

Remember to edit class variable $_secciones .请记住编辑类变量$_secciones Add the sections you allow to go to.添加您允许访问的部分。

<?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;

    }

}

?>

Just like that:就像这样:

<?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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM