В этой статье мы рассмотрим php-скрипт, позволяющий нам реализовать переключатели страниц (так называемый пагинатор), скажем, для нашей гостевой книги, создание которой мы описали в предыдущей статье.
Вот вызов функции, возвращающей нам массив переключателей:
$arrayPage = printPage($lastPage, $page);
Как мы видим, принимает она два параметра. lastPage – это общее количество страниц (в прошлой статье я рассказывал, как получить эту переменную), page – это активная страница, то есть та, на которой мы находимся.
В каком виде будут выводиться переключатели? Если сообщений оказалось очень мало или не оказалось вовсе, то весьма вероятно, что либо страниц не будет вовсе, либо будет всего одна. В таком случае скрипт вернёт пустой массив, который мы не будем выводить. А что если страниц очень много? Не стоит ведь выводить ссылки на все страницы сразу. Наш скрипт в любом случае будет выводить лишь 10 (9) переключателей. То, как будут выглядеть переключатели страниц при различных активных страницах, прекрасно демонстрируют следующие примеры:
- Активна страница — 1. Всего страниц — 8
1 2 3 4 5 6 7 8 - Активна страница — 1. Всего страниц — 14
1 2 3 4 5 … 10 11 12 13 14 - Активна страница — 5. Всего страниц — 30
1 2 … 3 4 5 6 7 … 29 30 - Активна страница — 8. Всего страниц — 30
1 2 … 6 7 8 9 10 … 29 30
Как видно из первого примера — если количество страниц или равно меньше 10, то функция должна вернуть все номера страниц по порядку. Если страниц больше, то в возвращаемом массиве будут присутствовать элементы, содержащие многоточия, символизирующие разрывы в нумерации. В третьем примере показан результат, в том случае, если активная страница находится далеко от первой и последней страниц. Она в любом случае будет обрамляться двумя ссылками на предыдущие страницы и двумя – на следующие. Также будут отображаться ссылки на 2 первые и последние страницы.
Теперь рассмотрим саму функцию:
function printPage($countPage, $actPage) { //если страниц 0 или 1, вернём пустой массив (переключатели не выводятся) if ($countPage == 0 || $countPage == 1) return array(); if ($countPage > 10) //если страниц больше 10, заполним массив pageArray переключателями в зависимости от активной страницы { //если активная страница - одна из первых или одна из последних страниц //то запишем в массив первые 5 и последние 5 переключателей, разделив их многоточием if($actPage <= 4 || $actPage + 3 >= $countPage) { for($i = 0; $i <= 4; $i++) { $pageArray[$i] = $i + 1; } $pageArray[5] = "..."; for($j = 6, $k = 4; $j <= 10; $j++, $k--) { $pageArray[$j] = $countPage - $k; } } //в противном случае в массив запишем первые и последние две страницы //а посередине - пять страниц, с обоих сторон обрамлённых многоточием. //активная страница, таким образом, окажется в центре переключателей. else { $pageArray[0] = 1; $pageArray[1] = 2; $pageArray[2] = "..."; $pageArray[3] = $actPage - 2; $pageArray[4] = $actPage - 1; $pageArray[5] = $actPage; $pageArray[6] = $actPage + 1; $pageArray[7] = $actPage + 2; $pageArray[8] = "..."; $pageArray[9] = $countPage - 1;; $pageArray[10] = $countPage; } } //если страниц меньше 10, просто заполним массив переключателей всеми номерами страниц подряд else { for($n = 0; $n < $countPage; $n++) { $pageArray[$n] = $n + 1; } } return $pageArray; }
Итак, на выходе мы имеем массив, состоящий из номеров страниц, а также, возможно, из одного-двух многоточий. Остаётся только вывести подобающим образом эти переключатели, а так как переключатели страниц – это ссылки, то мы должны приписать соответствующие get-параметры. Например, так:
<a href="http://example.com/?page=4">4</a>
То есть, каждый последующий элемент массива мы выводим дважды – как текст ссылки, а также как параметр. Стоит обратить внимание на то, что элементы массива, содержащие многоточия, разумеется, не должны быть ссылками, также как и активная страница.
Вот пример вывода переключателей страниц:
<? if ($lastPage > 1) { ?> <table> <tr height="10"> <? if ($lastPage > 10) { ?> <td style="padding-right: 3px;"> <? if ($page != 1) { ?> <a href="/?page=<?=$page-1;?>"">← сюда</a> <? } else { ?> <div>← сюда</div> <? } ?> </td> <? } ?> <? foreach ($arrayPage as $v) { ?> <td class="pageCell"> <? if ($v != $page && $v != "...") { ?> <a href="/?page=<?=$v;?>"><?=$v;?></a> <? } ?> <? if ($v == $page) { ?> <div class="active_page"><?=$v;?></div> <? } ?> <? if ($v == "...") { ?> <div class="page_dots"><?=$v;?></div> <? } ?> </td> <? } ?> <? if ($lastPage > 10) { ?> <td style="padding-left: 3px;"> <? if ($page < $lastPage) { ?> <a href="/?page=<?=$page+1;?>">туда →</a> <? } else { ?> <div>туда →</div> <? } ?> </td> <? } ?> </tr> </table> <? } ?>
И если постараться это всё оформить, то можно получить что-то вроде этого:
На этом всё, приятного кодинга! Если возникнут какие-то вопросы — спрашивайте в комментариях.