Переключатели страниц на PHP

Переключатели страниц на PHP

В этой статье мы рассмотрим 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;?>"">&larr; сюда</a>
        <? } 
        else { ?>
        <div>&larr; сюда</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;?>">туда &rarr;</a>
        <? } 
        else { ?>
        <div>туда &rarr;</div>
        <? } ?>
        </td>
        <? } ?>
 
        </tr>
    </table>
<? } ?>

И если постараться это всё оформить, то можно получить что-то вроде этого:

Пагинация

На этом всё, приятного кодинга! Если возникнут какие-то вопросы — спрашивайте в комментариях.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *