Доброго времени суток, уважаемые РНР-гуру! Я не требую писать за меня код, я лишь требую подсказать мне алгоритм или хотя бы навести меня на путь истинный. Вдруг кто-то до меня раньше уже придумал хорошее рабочее решение этой проблемы, так зачем же мне изобретать какой-то сомнительный велосипед. А история такая. Есть код, который выводит так много данных, что их приходится выводить по страницам. Но проблема в том, что и номеров этих страниц тоже так много, что они все не очень эстетично выглядят на одной странице. Хотелось бы чтобы они показывались покрасивше, например, с кнопочками типа [Предыдущие 20 страниц] и [Следующие 20 страниц], вот только сколько голову я не ломал, что-то ничего придумать для подобного отображения не смог. А код таков: PHP: <?php /*Есть переменные: $page - номер текущей страницы $pages - общее число страниц, взятое с БД $page_line - строка с HTML-кодом, выводящем кнопочки с номерами страниц */ $page_line = "<div class='pgnum'>Страницы:</div> "; $i = 1; while ($i <= $pages){ if($i == $page) { $page_line .= "<div class='pgnum'><b>".$i."</b></div>"; } else { $page_line .= "<div class='pgnum'><a href='?page=".$i."'>".$i."</a></div>";} $i++; } ?> В итоге получаем что-то типа вот этого: Красиво это до тех пор, пока номера страничек не начинают выстраиваться во второй ряд. Вот тут-то и неплохо было бы сочинить код для кнопочек типа [Предыдущие 20 страниц] и [Следующие 20 страниц], о которых уже говорилось выше. Только вот попытки придумать код для них закончились у меня не очень успешно... В общем, заранее благодарен всем, кто окажет мне помощь
ignordata, очень iliavlad, sobachnik, ну хоть какой вариант, лишь бы они в два ряда не выстраивались!
LokiFC мне очень понравился вариант как у гугла. достаточно зайти в поисковик и увидеть его внизу. фишка в том, что показывает от текущей страницы влево и вправо по 10 страниц. или же использовать стандартный вариант 1 2 3 ... 14 15 16 17 18 ... 44 45 46
Gromo, замечательный вариант, но как это сделать? Все предложенные варианты упираются в то, что опираясь на текущую страницу необходимо отобразить ее окружение в, скажем, 10 страниц с обоих сторон. Вот тут-то у меня и начинаются проблемы с реализацией идеи. Я не требую готовый код, просто подскажите КАК?
текущая, парочка рядом, +10 +50 +100 +1000 последняя тут есть тема про пагинатор/пейджер. Поискай на форуме. Это один из самых частых вопросов.
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, ' « 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> <b>'+$current+'</b> </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 »'); } }[/js]
Вот такой вариант у меня - написал когда-то уже давно и кочует оно у меня из проекта в проект, вроде корректно работает. Передаёшь функции общее количество страниц и текущую страницу, а она возвращает массив из циферок и точек. Потом где нужно перебираешь массив и если точка - отображаешь многоточие (или что там тебе нравится - типа промежуток, где не показаны страницы), если циферка - отображаешь ссылку на соответствующую страницу. PHP: <?php function pagesShow($pages = 1, $page = 1) { $showNear = 3; $showTotal = ($showNear + ($showNear - 1)) * 2 + 1; $pagesShow = array(); if($showTotal < $pages) { $stop = $showNear; for($pn = 1; $pn <= $stop; $pn++) $pagesShow[] = $pn; $start = $page - ($showNear - 1); if($start <= $showNear) $start = $showNear + 1; $stop = $page + ($showNear - 1); if($stop >= ($pages - ($showNear - 1))) $stop = $pages - $showNear; if($start > ($showNear + 1)) $pagesShow[] = '.'; for($pn = $start; $pn <= $stop; $pn++) $pagesShow[] = $pn; if($stop < ($pages - $showNear)) $pagesShow[] = '.'; $start = $pages - ($showNear - 1); for($pn = $start; $pn <= $pages; $pn++) $pagesShow[] = $pn; } else { for($pn = 1; $pn <= $pages; $pn++) $pagesShow[] = $pn; } return($pagesShow); } $total = 27; $page = 12; $pagesShow = pagesShow($total, $page); $out = '<pre>' . print_r($pagesShow, true) . '</pre>'; echo($out); ?>