2016-06-19 2 views
-2

Я хочу создать навигацию по страницам, в которой есть кнопки для текущей страницы и четырех ближайших существующих страниц. Вот несколько примеров.Pagination in PHP - как это сделать правильно?

  • Если текущая страница 5, то пользователь должен быть показан кнопки для страниц 3, 4, 5, 6, 7.
  • Если текущая страница 1 - 1, 2, 3, 4, 5
  • Если текущая страница 8, но есть только 9 страниц - 5, 6, 7, 8, 9

Я надеюсь, что вы получите эту идею. Следующие переменные, которые могут быть использованы:

  • $ Firstpage
  • $ ПредыдущаяСтраница
  • $ CurrentPage
  • $ СледующаяСтраница
  • $ Lastpage

Как бы вы это сделали? Или есть лучшая логика, которая может быть использована в отношении того, какие страницы отображают кнопки в навигации?

+1

боян так много вопросов –

+0

Возможная Дубликат [Простой PHP скрипт PAGINATION] (http://stackoverflow.com/questions/3705318/simple-php-pagination -script) – Jeff

+0

@Jeff Вы прочитали содержание своей ссылки или заданный вопрос? Это абсолютно не то же самое. Я был отмечен вашим комментарием. – keupsonite

ответ

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 | [email protected] 
-- 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

Просто так:

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