За последние 24 часа нас посетили 66685 программистов и 1638 роботов. Сейчас ищут 929 программистов ...

Не могу придумать алгоритм...

Тема в разделе "PHP для новичков", создана пользователем LokiFC, 27 июл 2011.

  1. LokiFC

    LokiFC Активный пользователь

    С нами с:
    27 июн 2008
    Сообщения:
    72
    Симпатии:
    0
    Адрес:
    Default City
    Доброго времени суток, уважаемые РНР-гуру!
    Я не требую писать за меня код, я лишь требую подсказать мне алгоритм или хотя бы навести меня на путь истинный. Вдруг кто-то до меня раньше уже придумал хорошее рабочее решение этой проблемы, так зачем же мне изобретать какой-то сомнительный велосипед.
    А история такая. Есть код, который выводит так много данных, что их приходится выводить по страницам. Но проблема в том, что и номеров этих страниц тоже так много, что они все не очень эстетично выглядят на одной странице. Хотелось бы чтобы они показывались покрасивше, например, с кнопочками типа [Предыдущие 20 страниц] и [Следующие 20 страниц], вот только сколько голову я не ломал, что-то ничего придумать для подобного отображения не смог. А код таков:
    PHP:
    1. <?php
    2. /*Есть переменные:
    3. $page - номер текущей страницы
    4. $pages -  общее число страниц, взятое с БД
    5. $page_line - строка с HTML-кодом, выводящем кнопочки с номерами страниц
    6. */
    7. $page_line = "<div class='pgnum'>Страницы:</div> ";
    8. $i = 1;
    9. while ($i <= $pages){
    10.     if($i == $page) { $page_line .= "<div class='pgnum'><b>".$i."</b></div>"; }
    11.     else { $page_line .= "<div class='pgnum'><a href='?page=".$i."'>".$i."</a></div>";}
    12.     $i++; }
    13. ?>
    В итоге получаем что-то типа вот этого:
    [​IMG]
    Красиво это до тех пор, пока номера страничек не начинают выстраиваться во второй ряд. Вот тут-то и неплохо было бы сочинить код для кнопочек типа [Предыдущие 20 страниц] и [Следующие 20 страниц], о которых уже говорилось выше. Только вот попытки придумать код для них закончились у меня не очень успешно...
    В общем, заранее благодарен всем, кто окажет мне помощь :)
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а листать много приходится?
     
  3. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    мне кажется, можно вывести страницы 1 ... 19 20 21 22 23 ... 100500 без кнопок "ещё 20 страниц".
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Угу, мне тоже такой вариант кажется лучше. Только я ещё делаю кнопку JavaScript "другая".
     
  5. LokiFC

    LokiFC Активный пользователь

    С нами с:
    27 июн 2008
    Сообщения:
    72
    Симпатии:
    0
    Адрес:
    Default City
    ignordata, очень :)
    iliavlad, sobachnik, ну хоть какой вариант, лишь бы они в два ряда не выстраивались!
     
  6. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    LokiFC
    мне очень понравился вариант как у гугла. достаточно зайти в поисковик и увидеть его внизу. фишка в том, что показывает от текущей страницы влево и вправо по 10 страниц.

    или же использовать стандартный вариант
    1 2 3 ... 14 15 16 17 18 ... 44 45 46
     
  7. LokiFC

    LokiFC Активный пользователь

    С нами с:
    27 июн 2008
    Сообщения:
    72
    Симпатии:
    0
    Адрес:
    Default City
    Gromo, замечательный вариант, но как это сделать?
    Все предложенные варианты упираются в то, что опираясь на текущую страницу необходимо отобразить ее окружение в, скажем, 10 страниц с обоих сторон. Вот тут-то у меня и начинаются проблемы с реализацией идеи. Я не требую готовый код, просто подскажите КАК?
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    текущая, парочка рядом, +10 +50 +100 +1000 последняя

    тут есть тема про пагинатор/пейджер. Поискай на форуме. Это один из самых частых вопросов.
     
  9. georgela

    georgela Активный пользователь

    С нами с:
    11 май 2011
    Сообщения:
    395
    Симпатии:
    0
    LokiFC
    Либо на Jquery либо страница передаётся методом Get где подгружаются ближлежащие 10 страниц.
     
  10. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    LokiFC
    если хорошо поискать по этому форуму, то где-то в постах есть код пейджинга 1 2 3 ... 14 15 16 17 18 ... 44 45 46
    в своё время на javascript написал пейджинг типа как у гугла:

    [js]function show_paging(){
    $total = 400;
    $start = 60;
    $limit = 10;

    $current = $start / $limit + 1;
    $visible = 20;

    if($total == 0) return false;

    $total = ($total % $limit > 0) ? ($total - ($total % $limit)) / $limit + 1 : $total / $limit;
    if($total <= 1) return false;

    if($current > $total){ $current = $total; }
    if($current > 1){ append_page($current-1, $limit, ' &laquo; PREV '); }

    $back = $total - $current;
    $back = $back < 10 ? $visible - $back : 10;

    for(var i=$back; i>0; i--){
    $page = $current - i;
    if($page > 0) append_page($page, $limit, $page);
    }

    $('#paging').append('<span>&nbsp;<b>'+$current+'</b>&nbsp;</span>');

    $forward = $current <= 10 ? $visible - $current : 9;

    for(var i=1; i <= $forward; i++){
    $page = $current + i;
    if($page <= $total) append_page($page, $limit, $page);
    }


    if($current < $total){ append_page($current+1, $limit, ' NEXT &raquo;'); }

    }[/js]
     
  11. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Вот такой вариант у меня - написал когда-то уже давно и кочует оно у меня из проекта в проект, вроде корректно работает. Передаёшь функции общее количество страниц и текущую страницу, а она возвращает массив из циферок и точек. Потом где нужно перебираешь массив и если точка - отображаешь многоточие (или что там тебе нравится - типа промежуток, где не показаны страницы), если циферка - отображаешь ссылку на соответствующую страницу.
    PHP:
    1. <?php
    2. function pagesShow($pages = 1, $page = 1) {
    3.     $showNear = 3;
    4.     $showTotal = ($showNear + ($showNear - 1)) * 2 + 1;
    5.     $pagesShow = array();
    6.     if($showTotal < $pages) {
    7.         $stop = $showNear;
    8.         for($pn = 1; $pn <= $stop; $pn++)
    9.             $pagesShow[] = $pn;
    10.         $start = $page - ($showNear - 1);
    11.         if($start <= $showNear) $start = $showNear + 1;
    12.         $stop = $page + ($showNear - 1);
    13.         if($stop >= ($pages - ($showNear - 1))) $stop = $pages - $showNear;
    14.         if($start > ($showNear + 1))
    15.             $pagesShow[] = '.';
    16.         for($pn = $start; $pn <= $stop; $pn++)
    17.             $pagesShow[] = $pn;
    18.         if($stop < ($pages - $showNear))
    19.             $pagesShow[] = '.';
    20.         $start = $pages - ($showNear - 1);
    21.         for($pn = $start; $pn <= $pages; $pn++)
    22.             $pagesShow[] = $pn;
    23.     } else {
    24.         for($pn = 1; $pn <= $pages; $pn++)
    25.             $pagesShow[] = $pn;
    26.     }
    27.     return($pagesShow);
    28. }
    29. $total = 27;
    30. $page = 12;
    31. $pagesShow = pagesShow($total, $page);
    32. $out = '<pre>' . print_r($pagesShow, true) . '</pre>';
    33. echo($out);
    34. ?>
     
  12. rainarr

    rainarr Активный пользователь

    С нами с:
    20 ноя 2010
    Сообщения:
    276
    Симпатии:
    0
    считаю что пагинатор лучше всего выглядит так:
    [​IMG]
    Кстати, состоит он всего то из 1 цикла :)