Комментарии: 14

Предыдущие 10 комментариев

  1. Николай

    Как сделать пагинацию с работающей сортировкой (по возрастанию/убыванию по алфавиту, дате...)? Отдельно сортировка и пагинация работают, вместе только на первой странице, дальше сортировка сбрасывается (устанавливается по дефолту).

  2. Михаил

    Вам нужно указывать в адресах других страниц списка не только их номера, но и требуемый тип сортировки. Вы используете G-Drive?

    Добавлено. В общем в G-Drive можно завести в таблице категорий специальное поле sort и сохранить в нем фрагменты текста запроса, определяющие все возможные типы сортировки:

    id...sortmodule
    ...`name` ASClist
    sort-by-name-desc...`name` DESClist
    sort-by-date...`date` ASClist
    sort-by-date-desc...`date` DESClist

    В тексте запроса нужно сделать соответствующую вставку:

    ... ORDER BY {$page['sort']} ...
    

    А при формировании ссылок указать текущий идентификатор:

    <a href="<?= pagelink($i, $page['id']) ?>"><?= $i ?></a>
    

    Также вместо поля sort можно использовать ассоциативный массив, индексируемый значениями поля id.

  3. Alexey

    Я знаю, что это тема уже обсуждалась, но всё равно не знаю, как это сделать. Пытаюсь реализовать галерею по примеру выше, чтобы на первой странице было всего две картинки, а на каждой последующей по четыре, и столкнулся с такой проблемой, что последняя страница не появляется до тех пор, пока на ней не будет больше двух картинок. Видимо, проблема со смещением картинки. Просто если $xpp поставить 0, то работает как надо. Как сделать правильно расчет, чтобы последняя страница появлялась сразу, если в неё попадёт хотя бы одна картинка?

    Вот код:

    <?php
      $galleryDir = opendir("gallery");
      
      $restricted = array(".","..","thumbs","index.html","Thumbs.db");
      
      while(false !== ($filename = readdir($galleryDir))){
        if(!in_array($filename, $restricted))
          $files_array[] = $filename;
      }
      $count = 0;
      $per_page = 4;
      $total_pages = ceil(count($files_array)/$per_page);
      
      $page = (isset($_GET['page']))?(int)$_GET['page'] : 1;
      
      $xpp = 2;
      $limit = $per_page - ($page<2)*$xpp;
      $start = ($page - 1) * $per_page - ($page>1)*$xpp;
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    <title>Loop Files in PHP</title>
    </head>
    <body>
    <h3>Viewing page <?php echo $page; ?> of <?php echo $total_pages; ?></h3>
    <div class="gallery-holder">
      <?php for($i = $start; $i < count($files_array); $i++){$count++;?>
        <a href="gallery/<?php echo $files_array[$i];?>">
         <img src="gallery/<?php echo $files_array[$i];?>">
        </a>
      <?php
      
      if($limit==$count)break;}
      ?>
    </div>
    <div class="nav" style="text-align:center;">
        <?php if($page>1){?>
          <a href="?page=<?php echo 1;?>">&larr; First</a>
          <a href="?page=<?php echo ($page - 1);?>">&larr; Prev</a>
          
        <?php }
          for($i=1;$i<=$total_pages; $i++)
          {
        ?>
              <a href="?page=<?php echo $i;?>"><?php echo $i;?></a>
        <?php 
          }
        ?>
          <?php if($total_pages > $page) { ?>
          <a href="?page=<?php echo ($page + 1); ?>">Next &rarr;</a>
          <a href="?page=<?php echo $total_pages;?>">Last &rarr;</a>
          <?php } ?>
    </div>
    </body>
    </html>
    
  4. Михаил

    Да, в первом комментарии, касающемся $xpp, я не все упомянул. Посмотрите этот комментарий и следующий за ним с моим ответом.

    Для ceil попробуйте сделать так (только $xpp определите до этой команды):

    $total_pages = ceil((count($files_array) + $xpp) / $per_page);
    

Отправить комментарий

Ваш адрес E-mail не будет опубликован.