Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Постраничный вывод фиксированной длины


Автор: Guedda 27.5.2010, 09:38
Добрый день, уважаемые программисты. Столкнулся, по сути, с тривиальной задачей, но ума не приложу, как ее лучше и оптимизированнее реализовать.
Суть такова:
Есть количество страниц (любое, от 1 до 1000). Мне необходимо, чтобы выводились ссылки на 10 страниц, присутствовали ссылки "Назад" и "Вперед" (соответственно, если страница одна, то никаких Назад и Вперед нет). 
Пример:
Цитата

1 2 3 4 5 6 7 8 9 10 Next >>

Так вот если пользователь находится на 10 странице (а страниц, допустим, 65), то при нажатии на ссылку Next >> он переходил на 11 страницу, а ссылки на страницы были такими:
Цитата

<<Prev 11 12 13 14 15 16 17 18 19 20 Next >>

Начал делать код, и застопорился. Пожалуйста, помогите. Вот код:
Код

<?php
$pages = 500;
if (isset($_GET['page'])) 
{
    $page = $_GET['page'];
}
else $page = 1;

if ($pages > 1)
                    {
                       $for_fifteen = 1;

                       if ($pages > 10)
                       {
                           $fifteen_ceil = ceil($pages / 10);
                       }

                       if ( $page > 1 )
                        {
                            echo "<span style=\"display: inline-block; width: 50px;\"><a href=\"?page=" . ($page - 1) . "\">" . "<< Prev" . "</a></span>";
                        }
                       for ($page_element = $for_fifteen; $page_element <= $pages; $page_element++)
                       {
                          if ($page_element == $page)
                          {
                             echo "<span style=\"display: inline-block; width: 50px;\">$page_element</span>";
                          }
                          else
                          {
                              echo "<span style=\"display: inline-block; width: 50px;\"><a href=\"?page=$page_element\">$page_element</a></span>";
                          }
                        }
                        if ( $page < $pages )
                        {
                            echo "<span style=\"display: inline-block; width: 50px;\"><a href=\"?page=" . ($page + 1) . "\">" . "Next >>" . "</a></span>";
                        }
                    }


Заранее благодарю за ответы.

Автор: ksnk 27.5.2010, 09:56
а если страниц 11, то на 11 странице внизу будут только << Prev и 11 ?
Кнопка Next переводит на следующую страницу? Была 3 стала 4?

А так - для каждого значка отдельно проверять нужно его выводить или нет. Никакой магии пока не придумалось, вроде... Думать некогда, трясти надо...

Автор: Guedda 27.5.2010, 09:59
Цитата(ksnk @  27.5.2010,  10:56 Найти цитируемый пост)
а если страниц 11, то на 11 странице внизу будут только << Prev и 11 ?

Да
Цитата(ksnk @  27.5.2010,  10:56 Найти цитируемый пост)
Кнопка Next переводит на следующую страницу? Была 3 стала 4?

Да
Цитата(ksnk @  27.5.2010,  10:56 Найти цитируемый пост)
А так - для каждого значка отдельно проверять нужно его выводить или нет.

Я думаю, что это будет неоптимизировано и будут лишние итерации... До сих пор нормального ничего не придумал... Давайте подумаем вместе...

Автор: patap 27.5.2010, 14:13
до этого дрянь была )) надо prev доделать
Код

define(PAGE_LIST, 10);
  define(PAGES, 104);
  
  $result = '';
  
  $current = $_GET['page'];
  $part = floor($current / 10);
  
  
  
  $page = $part * 10 + 1;
  
  $result .= ($part > 1 || $current == 10) ? '<a href="2.php?page='.($page - 1).'">prev</a> ' : '';
  
  $i = 1;
  $flag = true;
  while ($i <= PAGE_LIST) {
    if ($page <= PAGES) {
      $text = ($page == $current) ? '<b>'.$page.'</b>' : $page;
      
      $result .= '<a href="2.php?page='.$page.'">'.$text.'</a>&nbsp;&nbsp;&nbsp;';
      $page++;
      $i++;
    } else {
      $flag = false;
      break;
    }
  }
  
  $result .= ($flag) ? '<a href="2.php?page='.($current + 1).'">next</a> ' : '';
  
  echo $result;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)