Pagination на PHP
Когда-то я писал статью про создание навигации по страницам. В этой статье я рассказывал, как получить набор данных из таблицы БД, соответствующей выбранной пользователем странице. В этой же статье мы разберём вывод Pagination на PHP. Pagination - это список самих страниц. В Интернете есть различные варианты, но все они страдают одним - огромное количество кода для создания бесконечного числа вариантов. Но Вам разве нужна бесконечность? Вам нужен только 1 вариант, который и будет стоять на сайте. В этой статье мы с Вами создадим относительно сложный pagination, но при этом кода будет совсем не много.
Чтобы создать Pagination на PHP, нам необходимо иметь на входе несколько параметров:
- count_pages - количество страниц.
- active - текущая активная страница.
- count_show_pages - количество отображаемых страниц. Например, если будет 1000 страниц, то вывести их все весьма проблемно. Поэтому отображаться будет только заданное количество в этом параметре.
- url - адрес страницы, для которой и создаётся Pagination.
- url_page - адрес страницы с параметром page без значения на конце. Например, "/abc.php?func=create&page=".
Теперь мы можем создавать Pagination, вот так это выглядит на PHP:
<?php
/* Входные параметры */
$count_pages = 50;
$active = 15;
$count_show_pages = 10;
$url = "/index.php";
$url_page = "/index.php?page=";
if ($count_pages > 1) { // Всё это только если количество страниц больше 1
/* Дальше идёт вычисление первой выводимой страницы и последней (чтобы текущая страница была где-то посредине, если это возможно, и чтобы общая сумма выводимых страниц была равна count_show_pages, либо меньше, если количество страниц недостаточно) */
$left = $active - 1;
$right = $count_pages - $active;
if ($left < floor($count_show_pages / 2)) $start = 1;
else $start = $active - floor($count_show_pages / 2);
$end = $start + $count_show_pages - 1;
if ($end > $count_pages) {
$start -= ($end - $count_pages);
$end = $count_pages;
if ($start < 1) $start = 1;
}
?>
<!-- Дальше идёт вывод Pagination -->
<div id="pagination">
<span>Страницы: </span>
<?php if ($active != 1) { ?>
<a href="<?=$url?>" title="Первая страница"><<<</a>
<a href="<?php if ($active == 2) { ?><?=$url?><?php } else { ?><?=$url_page.($active - 1)?><?php } ?>" title="Предыдущая страница"><</a>
<?php } ?>
<?php for ($i = $start; $i <= $end; $i++) { ?>
<?php if ($i == $active) { ?><span><?=$i?></span><?php } else { ?><a href="<?php if ($i == 1) { ?><?=$url?><?php } else { ?><?=$url_page.$i?><?php } ?>"><?=$i?></a><?php } ?>
<?php } ?>
<?php if ($active != $count_pages) { ?>
<a href="<?=$url_page.($active + 1)?>" title="Следующая страница">></a>
<a href="<?=$url_page.$count_pages?>" title="Последняя страница">>>></a>
<?php } ?>
</div>
<?php } ?>
Сразу скажу, что кода хоть и немного, но он достаточно сложный для новичков. Года 3 назад я потратил очень много времени, чтобы сделать нечто подобное и тогда кода получилось раза в 2 больше.
А дальше можно этот Pagination через CSS украшать так, как Вы пожелаете. Можно и вёрстку изменить при желании (например, вместо угловых скобок "Предыдущая страница" и аналогичных поставить красивые картинки), главное, не трогать PHP-код.
Вот такой весьма удобный Pagination реализован на этом сайте, а так же на некоторых моих других сайтах.
-
- Михаил Русаков
Комментарии (25):
а скрипт вообше рабочий? нажимал на разные ссылки активной остатся 15 сераница
Ответить
А к БД подключался??
Ответить
а причем тут бд?
Ответить
в первом предложении по ссылке пройди...
Ответить
Данный скрипт лишь генерирует pagination на основе входных параметров. Никакого вывода контента тут нет и быть не может. По сути, данная статья - это продолжение той, о которой было сказано в первом предложении.
Ответить
про контент понятно. не понятно то что при нажатии на ссылку на другую страницу например: 10 стр. Почему активной остается 15 стр.
Ответить
Потому что $active = 15;
Ответить
Здраствуйте, Михаил.У меня такая проблема не могу вывести постраничную навигацию.Как можно вывести такой код foreach($news as $item):?> <a href="index.php?view=news&t=<?=$item['title_url'];?>"><img src="userfiles/news/<?=$item['img'];?>" alt="<?=$item['title'];?>" width="200" height="120" /></a> <?endforeach;}?>
Ответить
foreach($news as $item) { ?> а в конце <?php } ?> - лучше так делать, вместо endforeach.
Ответить
Спасибо огромное за данную статью! Долго время хотел сделать себе хороший Pagination. Собственный занимал в 5 раз больше места и был неудобен.
Ответить
Здраствуйте.Я сделал постраничную навигацию, но у меня ошибки появляется Warning: Missing argument 3 for select_data(), как это исправить.
Ответить
Абай Калдыбаев, в службу поддержки пишите.
Ответить
Здравствуйте! Скажите, пожалуйста, как задать и обратиться к $active, имея движок описанный в курсе php и mysql. там функция getPagination создает список ссылок, не пойму как определить ссылку активной.
Ответить
Здравствуйте, Александр. для обращения используйте "$this->" Пример: $this->name - вызывает переменную "name", объявленную и используемую внутри класса.
Ответить
Я не могу понять, как мы получаем переменную $active, откуда её вытаскивать? Допустим мы находимся на второй странице ($active = 2 в данный момент), переходим на четвертую страницу (мы должны сделать $active = 4 и т.д.)
Ответить
Все верно, Александр. В active попадает наша активная страница на данный момент. Каким способом ее вытаскивать, решать Вам.
Ответить
вот я и хотел узнать хотя бы один способ...
Ответить
можно через get-параметр
Ответить
Добрый день. Хотелось бы узнать, для чего мы инициализируем перем. right, если дальше мы ее не пользуем?
Ответить
Здравствуйте Михаил! Может вам добавить немного кода чтобы кнопка Предыдущая страница не была если текущая страница равна 1. В смысли в вашем коде когда active = 1 то вы даете ссылку на страницу index.php!
Ответить
$active = ($_GET['page']) ? $_GET['page'] : 1; вставляеш вместо $active = 15
Ответить
Здраствуйте. Большое спасибо за код! Подскажите пожалуйста а как сделать так чтобы ссылки на страницы выводились групками. По три цифры. То есть прям вот так 123 ... 10 11 12 ... 19 20 21 ... > последняя? А то страниц много, хочется выводить с вот такими диапазонами.
Ответить
Дякую за код. Все працює. Ломав голову щоб писати своє, але виручили. Ще раз дякую.
Ответить
Код из статьи на какой странице должен быть? Index если то у меня ошибка 500 выдаёт.
Ответить
Кстати, в коде: Переменная $right - определена, но нигде не используется. Соответственно, можно безболезненно выкинуть. Ибо, дальше определяется параметр $end, вполне достаточный для алгоритма...
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.