Как стать автором
Обновить

Простая пагинация на php

Решил описать такой на первый взгляд простой но очень интересный момент в web программирование как пагинация.
Наверное каждый web программист хоть раз да и сталкивался с пагинацией, и понимает что универсального решения нет! По этому я предлагаю посмотреть те простые решения которые сам использую.

p.s. В топике приведен пример пагинации на php, без использования AXAJ и тд. Это сделано для того что б продемонстрировать саму суть, так сказать сделать каркас.

image



Поехали!



И так начнем. Представим что у нас есть большое количество какого то контента контента (заметки, товары и тд). И вот в один момент мы понимаем что отображать все это на одной странице, неправильно и не хорошо. По этому мы решаем этот контент разбить на части (страницы).
Но для того что б нам это сделать нам нужно знать несколько значений.

  • Количество всех страниц.
  • Количество отображаемых страниц в пагинации.
  • Текущую страницу


Если честно то данных нам нужно немножко больше, но все это зависит от того какую именно пагинацию мы хотим сделать, так что об остальных данных мы поговорим чуть позже.


Допустим количество всех страниц нам известно и оно 45. Текущую страницу мы будем брать с $_GET'а, а если её там нет, то задавать она будет ровна 1.
А вот с количеством отображаемых страниц все интересней, я решил дать нашему скрипту немного гибкости, так что мы могли сами задать количество ссылок с лева и права от текущей странице, выглядит это примерно так: image

/*текущая страница*/

$iCurr = (empty($_GET['page']) ? 1 : intval($_GET['page']));

/*всего страниц или конечная страница*/

$iLastPage = 45;

/*левый и правый лимиты*/

$iLeftLimit = 4;
$iRightLimit = 5;

/*вызов функции*/
makePager($iCurr, $iLastPage, $iLeftLimit, $iRightLimit) ;


Ну вот все данные у нас уже есть и можно заняться самой функцией пагинации.

Наша функция называеться «makePager», и она ожидает от нас 4 параметра:
  1. текущая страница — $iCurr
  2. всего страниц или конечная страница — $iLastPage
  3. левый лимит — $iLeftLimit
  4. правый лимит- $iRightLimit


Код:
function makePager($iCurr, $iEnd, $iLeft, $iRight)
{
if($iCurr > $iLeft && $iCurr < ($iEnd-$iRight))
{
for($i=$iCurr-$iLeft; $i<=$iCurr+$iRight; $i++)
{
//вывод
}}

elseif($iCurr<=$iLeft)
{
$iSlice = 1+$iLeft-$iCurr;
for($i=1; $i<=$iCurr+($iRight+$iSlice); $i++)
{
//вывод
}}
else
{
$iSlice = $iRight-($iEnd - $iCurr);
for($i=$iCurr-($iLeft+$iSlice); $i<=$iEnd; $i++)
{
//вывод}}}


Я специально убрал вывод, что б не засорять код, но он мог выглядеть например так:
if($iCurr > $iLeft && $iCurr < ($iEnd-$iRight))
{
for($i=$iCurr-$iLeft; $i<=$iCurr+$iRight; $i++)
{
echo ''.($i == $iCurr ? ''.$i.'' : $i).'' ;
}}


Давай посмотрим код поближе.
Первый вариант развития событий, это если наша страница находиться где то в центре (например страница 8), и количество страниц с лева и с права могут свободно отображаться, это самый простой вариант из возможных.

if($iCurr > $iLeft && $iCurr < ($iEnd-$iRight))
{
for($i=$iCurr-$iLeft; $i<=$iCurr+$iRight; $i++)
{
//вывод
}}


А что же будет если мы находиться например на странице номер 2?
Ведь в условии мы задали что нужно отображать с лева 4 ссылки.
Тогда нам на помощь приходит следующий код:

elseif($iCurr<=$iLeft)
{
$iSlice = 1+$iLeft-$iCurr;
for($i=1; $i<=$iCurr+($iRight+$iSlice); $i++)
{
//вывод
}}


$iSlice — это количество элементов которые не будут показаны с лева, и которые соотвецтвенно нужно добавить справа, что количество ссылок оставалось постоянным.

Можно было б if'ом запретить вывод страницы если она меньше 1 и больше макс. странице но это б было так не красиво.


Ну и последний вариант, что если мы находимся например на 44 странице, и показать с права 5 мы не можем тк, страниц всего 45?
И код:
else {
$iSlice = $iRight-($iEnd - $iCurr);
for($i=$iCurr-($iLeft+$iSlice); $i<=$iEnd; $i++)
{
//вывод
}}


Вот так все просто.

P.S.

Еще несколько вариаций на тему:
Если нам не важно что б количество выводимых ссылок было одинаковое то можно 2 и 3 условия заменить такими:
//второе условия:
elseif($iCurr<=$iLeft)
{
for($i=1; $i<=$iCurr+$iRight; $i++)
{
//вывод
} }

//третье условия:

else{
for($i=$iCurr-$iLeft; $i<=$iEnd; $i++)
{
//вывод
} }

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.