Как укорачивать пагинацию в PHP?

У меня есть пагинация в PHP, которая как в следующем изображении:

Paginacion

Однако, увеличивается соответствующее число страниц я ввожу больше реестров в компьютер в базу данных, так как он разворачивает мне из-за страницы 10 реестров. Мне хотелось бы, что например, в моей пагинации он показал себе с 1 до 10, и что, когда он прибудет к 10, он показал себе с 10 до 20... Не, если я объясняюсь.

Я оставляю код PHP, который он использует.

 

7
задан 13.08.2016, 01:27
3 ответа

Здесь я оставляю тебе выбор, основанный на твоем коде и с минимальными изменениями на том же самом.

Идея достаточно простая (хотя я не знаю, ли объясню я ее хорошо) и он состоит из следующего: показывать всегда максимум 10 ссылок, которые начнутся с единицей и покончат со счастьем unidad+9 (или общее количество страниц, если unidad+9 он будет больше). Это означает, что для страницы 5, показанные ссылки будут 1 до 10; для страницы 13, ссылки будут 11 до 20, и т.д.

Для этого он надо: считать, каковым будет первое число и последнее число, которое будет нужно показывать, и способствовать тому, чтобы цикл был только между ними. Потом во время показывания стрел будет нужно подтверждать, меньше ли, чем 10 первая страница (в котором случае она не явится стрелой в левую сторону), или если последняя страница будет равна общему количеству страниц (в случае которых она не явится стрелой в правую сторону).

Здесь я оставляю тебе пример, из как он был бы сделан:

Заметь - Я уверен (почти), что возможно упрощать каким-то образом вычисление первого и последнего, но мой мозг жарился прямо сейчас (изначально у него было супер-сложное вычисление и это уменьшал до этого)

<?php
// calculamos la primera y última página a mostrar
$primera = $pagina - ($pagina % 10) + 1;
if ($primera > $pagina) { $primera = $primera - 10; }
$ultima = $primera + 9 > $total_paginas ? $total_paginas : $primera + 9; 
?>
<nav aria-label="Page navigation" class="text-center">
     <ul class="pagination">
        <?php
        if ($total_paginas > 1) {
            // comprobamos $primera en lugar de $pagina
            if ($primera != 1)
                echo '<li><a href="'.$url.'?pagina='.($primera-1).'" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>';

            // mostramos de la primera a la última
            for ($i = $primera; $i <=$ultima; $i++){
                if ($pagina == $i)
                    echo '<li class="active"><a href="#">'.$pagina.'</a></li>';
                else
                    echo '<li><a href="'.$url.'?pagina='.$i.'">'.$i.'</a></li>';
            }

            if ($i <= $total_paginas)
                echo '<li><a href="'.$url.'?pagina='.($i).'"><span aria-hidden="true">&raquo;</span></a></li>';
        }
        ?>
      </ul>
</nav>
6
ответ дан 24.11.2019, 13:39
  • 1
    #161; Ты - колдун! (В хорошем чувстве). и #161; Большое спасибо! – Hoose 14.08.2016, 05:45

Делая что-то сходным с тем, что сделал Альваро, принимая твой код как базовый, это версия незначительно отличная, цели:

  • Показывать 5 предыдущих страниц и 5 следующих за настоящей
  • Показывать первую страницу, если он не в предыдущей группе
  • Показывать последнюю страницу, если он не в группе первой точки

Идея об этом ответе состоит в том, чтобы добавлять выбор для тех, кто находят этот вопрос "в будущем".

$primera = ($pagina - 5) > 1 ? $pagina - 5 : 1;
$ultima = ($pagina + 5) < $total_paginas ? $pagina + 5 : $total_paginas;

if ($total_paginas > 1) {

    // flecha anterior
    if ($pagina != 1) {
        echo '<li><a href="'.$url.'?pagina='.($pagina-1).'" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>';
    }

    // si la primera del grupo no es la pagina 1, mostramos la 1 y los ...
    if ($primera != 1) {
        echo '<li><a href="'.$url.'?pagina=1">'.$i.'</a></li>';
        echo '<li>...</li>';
    }

    // mostramos la página actual, las 5 anteriores y las 5 posteriores
    for ($i = $primera; $i <= $ultima; $i++){
        if ($pagina == $i)
            echo '<li class="active"><a href="#">'.$pagina.'</a></li>';
        else
            echo '<li><a href="'.$url.'?pagina='.$i.'">'.$i.'</a></li>';
    }

    // si la ultima del grupo no es la ultima (lol), mostramos la ultima y los ...
    if ($ultima != $total_paginas) {
        echo '<li>...</li>';
        echo '<li><a href="'.$url.'?pagina='.$total_paginas.'">'.$i.'</a></li>';
    }

    // flecha siguiente
    if ($pagina != $total_paginas) {
        echo '<li><a href="'.$url.'?pagina='.($pagina+1).'"><span aria-hidden="true">&raquo;</span></a></li>';
    }

}
3
ответ дан 24.11.2019, 13:39

Равный он состоит в том, чтобы менять немного концепцию того, что ты используешь сейчас. Я это делаю так что пагинация, я реализую ее в классе и потом в PHP, я звоню в пагинацию.

Этот файл это у меня есть для связи PDO, но если ты ищешь из-за Интернета, конечно, что ты это находишь для mysql или mysqli

paginacion.php

class PDO_Pagination
{
  public $connection;
      public $total;
      public $page;
      public $total_page;
      public $start_row;
      public $item;
      public $max_pages;
      public $max_rows;
      public $step;
      public $max;
      public $param;
      public $btn_first_page;
      public $btn_last_page;
      public $btn_next_page;
      public $btn_back_page;
      public $btn_page;
      public $btn_active;

      public function __construct($connection) {
      $this->btn_first_page = 'Previous';
      $this->btn_last_page = 'Last';
      $this->btn_next_page = 'Next';
      $this->btn_back_page = 'Back';
      $this->btn_page = 'Pag.';
      $this->btn_active = 'active';
      return $this->connection = $connection;
  }

  public function rowCount($query){
      $query = $this->connection->prepare($query);
      $query->execute();
      $this->total = $query->rowCount();
  }

      public function config($max_pages, $max_rows){
      $this->start_row = 0;
      $this->item = 0;
      $this->max_pages = $max_pages;
      $this->max_rows = $max_rows;
      $this->total_page = $this->total / $this->max_rows;

      if (isset($_GET["page"])){
          $this->page = $_GET["page"];
          if ($this->page < 0 || !preg_match("/^([0-9])+$/", $this->page)){
              return;
          }

          $this->start_row = $this->page * $this->max_rows;

          $this->item = $_GET["item"];
          if ($this->item < 0  || !preg_match("/^([0-9])+$/", $this->item)){
              return;
          }

          $this->max_pages = $this->max_pages + $this->max_rows;

          $this->max = $_GET["max"];
          if ($this->max < 0  || !preg_match("/^([0-9])+$/", $this->max)){
              return;
          }
          $this->max_pages = $this->max;
      }


      if(isset($_GET["next_page"])){
          $this->page = $_GET["next_page"];
          if ($this->page < 0  || !preg_match("/^([0-9])+$/", $this->page)){
              return;
          }

          $this->start_row = $this->page * $this->max_rows;

          $this->item = $_GET["item"];
          if ($this->item < 0  || !preg_match("/^([0-9])+$/", $this->item)){
              return;
          }

          $this->max = $_GET["max"];
          if ($this->max < 0  || !preg_match("/^([0-9])+$/", $this->max)){
              return;
          }
              $this->max_pages = $this->max + 1;
          }

          if(isset($_GET["back_page"])){
          $this->page = $_GET["back_page"] - 1;
          if ($this->page < 0  || !preg_match("/^([0-9])+$/", $this->page)){
              return;
          }
          $this->start_row = $this->page * $this->max_rows;

          $this->item = $_GET["item"] - 1;
          if ($this->item < 0  || !preg_match("/^([0-9])+$/", $this->item)){
              return;
          }

          $this->max = $_GET["max"];
              if ($this->max < 0  || !preg_match("/^([0-9])+$/", $this->max)){
              return;
          }

          $this->max_pages = $this->max - 1;
      }

          if (isset($_GET["previous"])){
          $this->max_pages = $this->max_pages;
          $this->start_row=0;
          $this->item = 0;
      }
  }

  public function pages($class=''){

  if($this->item >= 1){
          echo "<a class='$class'  href='?previous=1".$this->param."'>$this->btn_first_page</a>";
          echo "<a class='$class'  href='?back_page=$this->page&item=$this->item&max=$this->max_pages".$this->param."'>$this->btn_back_page</a>";
      }
      for($x = $this->item; $x < $this->max_pages; $x++){
      while($x * $this->max_rows < $this->total){
          $p = $x+1;
          $this->page == $p-1 ? $active = ' ' . $this->btn_active : $active = null;
          echo "<a class='$class$active' href='?page=$x&item=$this->item&max=$this->max_pages".$this->param."'>$p</a>";
          break;
      }
  }

      $numbers = $this->page+1;
      echo "<span class='$class'>$this->btn_page <b>$numbers</b></span>";

      if ($this->max_pages * $this->max_rows < $this->total){
      $this->page = $this->page+1;
      $this->item = $this->item + 1;
      echo "<a class='$class' href='?next_page=$this->page&item=$this->item&max=$this->max_pages".$this->param."'>$this->btn_next_page</a>";

      $this->page = round($this->total_page - 1);
      $this->item = round($this->total_page - $this->max_pages);
      $this->max = round($this->total_page);
      echo "<a class='$class'  href='?page=$this->page&item=$this->item&max=$this->max".$this->param."'>$this->btn_last_page</a>";
  }
  }
}

Вызов в коде был бы:

<?php
$connection = dbConnect ();
$pagination = new PDO_Pagination($connection);
$pagination->rowCount("SELECT * FROM noticias WHERE publicado=1");
$pagination->config(5, 30); 
$sql = "SELECT * FROM noticias WHERE publicado=1 ORDER BY fecha DESC LIMIT $pagination->start_row,
$pagination->max_rows";
$query = $connection->prepare($sql);
$query->execute();
$model = array();
while($rows = $query->fetch())
 {
  $model[] = $rows;
}
 foreach($model as $row){
  echo "<li class='li_noticias'>";
  echo "<a href='".$row['idref'].".html' rel='follow'>";
  //echo "<a href='noticias2.php?ref=".$row['idref']."' rel='follow'>";
   echo $row['titulo'];
   echo "</a>";
   echo "</li>";
 }
?>
0
ответ дан 24.11.2019, 13:39

Теги

Похожие вопросы