Нумерация страниц на php (пагинация).


Для создания нумерации страниц в готовых CMS рядовым пользователям не нужно задумываться о том, как этот механизм будет функционировать. Большое количество программистов уже позаботились о том, чтобы все выводилось там, где нужно и как нужно. Однако, иногда возникают ситуации, когда в процессе создания собственного шаблона для сайта приходится решать подобные задачи самостоятельно (в особенности, когда готовые решения в виде плагинов не подходят). Здесь нам на помощь приходит php. Далее рассматривается один из примеров подобного скрипта.

Скрипт состоит из функции, которой передаются «входные» параметры. Перед ее вызовом ваш сценарий должен определить все эти необходимые переменные. Для определения номера текущей страницы вы можете «выудить» необходимую информацию, например, из урла (решение данной задачи – ваше домашнее задание).

Итак, определяем все необходимые переменные.

1
2
3
4
5
6
$all = 150; //количество постов в категории (определяем количество постов в базе данных)
$lim = 10; //количество постов, размещаемых на одной странице
$prev = 3; //количество отображаемых ссылок до и после номера текущей страницы
$curr_link = 18; //номер текущей страницы (получаем из URL)
$curr_css = "current"; //css-стиль для ссылки на "текущую (активную)" страницу
$link = "http://site.ru/category/news/"; //часть адреса, который будет использован для формирования линков на другие страницы

В нужном нам месте вызываем функцию для создания нумерации, передавая ей исходные данные:

1
pagination($all,$lim,$prev,$curr_link,$curr_css,$link);

Ну и собственно, сама функция. С виду кажется несколько сложно для восприятия, так как идет рутинный и дотошный процесс создания линка по частям. Здесь нужно обратить внимание на три момента:

1. Функция позволяет задавать необходимое количество отображаемых номеров на странице. Если страниц очень много, а вы задали к примеру 3 линка до и после номера текущей страницы, то она сформирует такой результат:

1…14 15 17 18 19 20 21 … 100

2. Можно задать, чтобы при текущей странице до 7 или 10 символы «…» не появлялись, а отображались все страницы до текущей. Подправить это можно в строке 11 (замените 6 любым другим числом страниц).

3. Чтобы исключить дублирование первой страницы для ее линка не добавляются дополнительные данные (?page=1). Соответственно, ваш контроллер должен делать проверку: если параметр page в линке отсутствует, то это первая страница.

Данный скрипт позволяет получать УРЛы с номерами страниц, например, так http://site.ru/category/news/?page=6.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
function pagination($all, $lim, $prev, $curr_link ,$curr_css, $link)
{
//осуществляем проверку, чтобы выводимые первая и последняя страницы
// не вышли за границы нумерации
    $first=$curr_link-$prev;
    if($first<1) $first=1;
    $last=$curr_link+$prev;
    if($last>ceil($all/$lim))$last=ceil($all/$lim);
 
//начало вывода нумерации
//выводим первую страницу
    $y=1;
    if($first>1) echo "<a href='{$link}?page={$y}'>1</a> ";
//если текущая страница далеко от 1-й, то часть предыдущих страниц 
//скрываем троеточием
    $y=$first-1;        
    if($first>6) {
       echo "<a href='{$link}?page={$y}'>...</a> ";
    }else {
//если текущая страница имеет номер до 10, то выводим все номера 
//перед заданным диапазоном без скрытия 
        for($i=2;$i<$first;$i++){
            echo "<a href='{$link}?page={$i}'>$i</a> ";
        }
    }
//отображаем заданный диапазон: текущая страница +-$prev
    for($i=$first;$i<$last+1;$i++){
 
        if($i==$curr_link){?>
   //если выводится текущая страница, то ей назначается особый стиль css
            <span><?=$i?></span>
        <?php }else{
                 $alink = "<a href='{$link}";
                 if($i != 1) $alink .= "?page={$i}";
                 $alink .= "'>$i</a>      ";
                 echo $alink;
        }
    }
 
    $y=$last+1;
    //часть страниц скрываем троеточием
    if($last<ceil($all/$lim) and ceil($all/$lim)-$last>2) echo "<a href='{$link}?page={$y}'>...</a> ";
    //выводим последнюю страницу
    $e=ceil($all/$lim);
    if($last<ceil($all/$lim)) echo "<a href='{$link}?page={$e}'>$e</a>";
}

Другие посты

Категория: PHP-скрипты

Комментарии (5)

 

  1. Спасибо большое, заработало. Только вот у меня вопрос, не могу понять, почему при переходе с второй, третей, четвёртой страницы на первую ее содержимое не отображается, а вот если переходить на первую с более отдаленных от нее страниц (к примеру с 20) то она отображается.

  2. Jack:

    Вместо {$link} можно писать $_SERVER[PHP_SELF], и одной переменной в функции будет меньше

  3. admin:

    Вряд ли это можно использовать при ЧПУ

  4. Евгений:

    Serhiy и все, кто копирует скрипт, надо исправить скрипт:

    Вместо
    if($i != 1) $alink .= «?page={$i}{$anchor}»;

    Просто $alink .= «?page={$i}{$anchor}»;

    Всё работать будет)))

  5. admin:

    Проверка $i != 1 добавлена, чтобы не создавать дубль первой страницы. Например, если у вас из меню стоит ссылка на раздел /books, то не очень хорошо добавлять дубль /books?page=1. Для поисковиков это недостаток. Если ваш сайт лишен этого, то можно добавлять к ссылке и на первую страницу параметры

Оставить комментарий


Яндекс.Метрика