Переключатели страниц на 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>
<? } ?>

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

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

  • Вадим, хорошо написано. Как раз искал вывод без плагина.
    А можешь добавить к статье, как на практике по шагам сделать. В какие файлы все прописывать,

  • Dmitry

    Что же вы не дописали статью?

    где продолжение кода?

    function printPage($countPage, $actPage)
    {
    //если страниц 0 или 1, вернём пустой массив (переключатели не выводятся)
    if ($countPage == 0 || $countPage == 1) return array();
    if ($countPage > 10) //если страниц больше 10, заполним массив pageArray переключателями в зависимости от активной страницы
    {
    //если активная страница - одна из первых или одна из последних страниц
    //то запишем в массив первые 5 и последние 5 переключателей, разделив их многоточием
    if($actPage= $countPage)
    {
    for($i = 0; $i

  • Dmitry, видимо, при публикации затерялось. Исправил.

  • Dmitry

    Спасибо все работает!

  • Добрый день
    Возможно ли пагинатор реализовать через JavaScript ?
    Удачи и успеха в работе.

    • Да, организовать генерацию номеров страниц на JS можно, но само переключение реализовывать нужно на серверной части.

  • Николай
    1
    
     

    Возможно тут у вас название переменной не совпадает с возвращаемой переменной из функции.

  • $lastPage еще нужно поделить на количество статей выводимых на одной странице, а так получится сколько записей в бд, столько и страниц.

    а так спасибо, все работает.