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


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

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

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

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

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

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

Ну и собственно, сама функция.

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
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-й (>10), то часть предыдущих страниц
    // скрываем троеточием
    // Если текущая страница имеет номер до 10, то выводим все номера
    // перед заданным диапазоном без скрытия
    $y = $first - 1;
    if ($first > 10) {
        echo "<a href='{$link}?page={$y}'>...</a> ";
    } else {
        for($i = 2;$i < $first;$i++){
            echo "<a href='{$link}?page={$i}'>$i</a> ";
        }
    }
    // отображаем заданный диапазон: текущая страница +-$prev
    for($i = $first;$i < $last + 1;$i++){
        // если выводится текущая страница, то ей назначается особый стиль css
        if($i == $curr_link) { ?>
 
            <span><?php echo $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) && 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>";
}

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

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

1…14 15 17 18 19 20 21 … 100

то есть часть ссылок будет скрыто для компактности.

2. Если текущая страница имеет номер до 10 включительно, то все предыдущие страницы будут отображены без скрытия — это особенность данного скрипта. Подправить это можно в строке 19 (замените 10 любым другим числом страниц).

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

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





Другие посты

Категория: 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. Для поисковиков это недостаток. Если ваш сайт лишен этого, то можно добавлять к ссылке и на первую страницу параметры

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