php пагинация с точками
Делаем пагинацию на PHP
Зачастую в тестовых заданиях на джунов присутствует пункт о реализации пагинации в какой-нибудь системе. И мне довольно часто прилетают просьбы показать как это делается, так как зачастую это задание ставит в тупик начинающих разработчиков. Что-ж, давайте разбираться.
Делать пагинацию я хочу предложить на базе написанного нами в курсе ООП в PHP движка для блога. Готовый проект можно взять по ссылке. Накатите дамп базы и настройте веб-сервер так, чтобы корневой директорией для домена myproject.loc была папка www.
Теперь давайте добавим побольше статей в базу, чтобы было по чему пагинацию делать.
Посмотрим на имеющиеся у нас статьи. Отсортируем их в обратном порядке.
Теперь, если вы еще не в курсе, нужно познакомиться с двумя конструкциями языка SQL: LIMIT и OFFSET. Они позволяют получить только часть строк из тех, что были получены запросом. LIMIT задаёт лимит записей, OFFSET задает количество строк, которые нужно пропустить.
Например, мы хотим пропустить первые 5 строк, и вывести следующие 10 строк:
Как видим, у нас пропустились первые 5 строк с id: 22,21,20,19,18, которые присутствовали в результате запроса без LIMIT и OFFSET. Также мы видим, что строк у нас здесь 10.
Как нетрудно догадаться, для реализации пагинации нам можно воспользоваться этими конструкциями. Если мы хотим выводить на каждой странице нашего блога по 5 записей, то для получения записей на первой странице стоит использовать запрос:
Для второй страницы запрос будет следующим:
То есть здесь мы пропустили первые 5 записей и вывели следующие 5.
Аналогично строим запрос для третьей страницы:
И так далее, пока записи не закончатся.
Получаем формулу для получения запроса, которые выводит записи на n-ой странице блога, где k-число записей на одной странице:
Чтобы понять, сколько у нас будет страниц, нам нужно число записей разделить на число записей, выводимых на одной странице. Полученное число округляем в большую сторону. К примеру, если у нас 22 записи, и на одной странице выводим 5, то число страниц будет 22/5 = 4,4. Округляем в большую сторону и получаем 5. На первых четырех страницах у нас будет по 5 записей, а на последней будет 2 записи.
Получить общее число записей можно с помощью запроса:
Осталось всё это дело закодить. Начнём с самого простого – выведем ссылки на странички со статьями.
В классе ActiveRecordEntity добавляем метод для получения количества страниц. Метод будет принимать на вход количество записей на одной странице.
В MainController вызовем этот метод и передадим в шаблон число страниц.
Добавим в шаблоне внизу странички номера страниц.
Обратите внимание: при формировании ссылки на страницу мы проверяем, является ли страничка первой, и если это так, то формируем ссылку на главную страницу, иначе формируем ссылку вида: /n, где n – номер страницы.
Посмотрим на результат:
Теперь давайте напишем метод для получения записей на n-ой страничке. Для этого в классе ActiveRecordEntity добавим метод getPage(), принимающий на вход количество записей на одной странице и номер страницы.
Добавим в MainController экшен для странички.
Переписываем экшен main.
Проверяем главную страницу:
Добавляем роут для страничек с номерами.
Всё. Пагинация готова. Можно переходить по страничкам. Так выглядит пятая страница.
Из улучшений можно сделать текущий номер страницы не ссылкой, а просто текстом. Для этого передадим номер текущей странички в шаблон.
В шаблоне будем сравнивать текущий номер страницы с тем, который в текущей итерации.
Вот такая простая пагинация у нас получилась. Она подойдет для большинства проектов без высокой нагрузки и с небольшим количеством записей. А для крупных проектов потребуется более специфичное решение, которое я рассмотрю в одном из ближайших уроков.
Изменения, сделанные в ходе урока, вы можете посмотреть на гитхабе.
Простая пагинация на php
Решил описать такой на первый взгляд простой но очень интересный момент в web программирование как пагинация.
Наверное каждый web программист хоть раз да и сталкивался с пагинацией, и понимает что универсального решения нет! По этому я предлагаю посмотреть те простые решения которые сам использую.
p.s. В топике приведен пример пагинации на php, без использования AXAJ и тд. Это сделано для того что б продемонстрировать саму суть, так сказать сделать каркас.
Поехали!
И так начнем. Представим что у нас есть большое количество какого то контента контента (заметки, товары и тд). И вот в один момент мы понимаем что отображать все это на одной странице, неправильно и не хорошо. По этому мы решаем этот контент разбить на части (страницы).
Но для того что б нам это сделать нам нужно знать несколько значений.
Если честно то данных нам нужно немножко больше, но все это зависит от того какую именно пагинацию мы хотим сделать, так что об остальных данных мы поговорим чуть позже.
/*всего страниц или конечная страница*/
/*левый и правый лимиты*/
$iLeftLimit = 4;
$iRightLimit = 5;
Ну вот все данные у нас уже есть и можно заняться самой функцией пагинации.
Давай посмотрим код поближе.
Первый вариант развития событий, это если наша страница находиться где то в центре (например страница 8), и количество страниц с лева и с права могут свободно отображаться, это самый простой вариант из возможных.
А что же будет если мы находиться например на странице номер 2?
Ведь в условии мы задали что нужно отображать с лева 4 ссылки.
Тогда нам на помощь приходит следующий код:
$iSlice — это количество элементов которые не будут показаны с лева, и которые соотвецтвенно нужно добавить справа, что количество ссылок оставалось постоянным.
Можно было б if’ом запретить вывод страницы если она меньше 1 и больше макс. странице но это б было так не красиво.
Простая пагинация на PHP/Javascript. Создаем постраничную навигацию
Разрабатывая любой проект часто приходиться сталкиваться с необходимостью создания постраничной навигации или как еще называют – пагинация. Будь-то список статей, пользователей или любые другие выборки с базы данных, где большое количество записей требуют лимитированного вывода. Такой вывод можно реализовать двумя способами:
1. Выгружать все данные и показывать пользователю только часть.
2. Выгружать только часть данных, которые непосредственно показывать.
Каждый из способов имеет свои плюсы и минусы, очевидно, если записей в базе очень много, то выгружая все, мы очень сильно нагружаем компьютер пользователя. Просто представьте, что при открытии страницы у вас подгружается 100.000 записей, с другой стороны, если выгрузка имеет только 100 элементов, то такой способ будет работать быстрее, так как не нужно постоянно обращаться к серверу.
В статье мы разберем второй способ, а именно выгрузку только тех данных, которые отдаются пользователю на текущей странице.
1. Функция pagePrint(), печатает ссылку на заданую страницу
$page – номер страницы;
$title – анкор ссылки (например, “1”, “2”, “10”, “следующая”);
$show – показывать ссылку или текст, используется, чтобы вывести текущую страницу, или же неактивные ссылки “назад”, “вперед”;
$active_class – класс CSS для активной страницы.
2. Начальный конфиг
3. Пример выборки данных из базы
Для выборки используется LIMIT, где старт вычисляется по формуле (page-1)*limit, то есть для первой страницы start = 0.
4. Подсчет кол-ва страниц и проверка основных условий.
С подсчетом количества страниц иногда возникают проблемы, так как страниц может быть только целое число, а при делении (кол-во записей)/(лимит записей на странице) может получится дробное. Данный результат необходимо округлить в больную строну, потому что, обычное округление round(), выдаст ошибочный результат.
Пример, всего записей 31, на странице публикуем по 10, таким образом по формуле получается 3.1 страница, при округлении round(3.1) = 3, что неправильно, так как теряется одна запись. Поэтому используется функция ceil(), ceil(3.1) = 4.
5. Выводим на экран:
Вот и все, алгоритм разобран, ниже представлен код для вывода пагинации на Javascript:
Остались вопросы – задаем в комментариях, также делимся своими наработками, если знаете как “красивее” реализовать пагинацию.
Pagination на PHP
Чтобы создать Pagination на PHP, нам необходимо иметь на входе несколько параметров:
Теперь мы можем создавать Pagination, вот так это выглядит на PHP:
Сразу скажу, что кода хоть и немного, но он достаточно сложный для новичков. Года 3 назад я потратил очень много времени, чтобы сделать нечто подобное и тогда кода получилось раза в 2 больше.
А дальше можно этот Pagination через CSS украшать так, как Вы пожелаете. Можно и вёрстку изменить при желании (например, вместо угловых скобок «Предыдущая страница» и аналогичных поставить красивые картинки), главное, не трогать PHP-код.
Вот такой весьма удобный Pagination реализован на этом сайте, а так же на некоторых моих других сайтах.
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Комментарии ( 25 ):
а скрипт вообше рабочий? нажимал на разные ссылки активной остатся 15 сераница
А к БД подключался??
в первом предложении по ссылке пройди.
про контент понятно. не понятно то что при нажатии на ссылку на другую страницу например: 10 стр. Почему активной остается 15 стр.
Спасибо огромное за данную статью! Долго время хотел сделать себе хороший Pagination. Собственный занимал в 5 раз больше места и был неудобен.
Здраствуйте.Я сделал постраничную навигацию, но у меня ошибки появляется Warning: Missing argument 3 for select_data(), как это исправить.
Абай Калдыбаев, в службу поддержки пишите.
Все верно, Александр. В active попадает наша активная страница на данный момент. Каким способом ее вытаскивать, решать Вам.
Пагинатор. Постраничный вывод данных на php
В этой статье я приведу пример работы пагинатора — вывода записей из базы данных постранично. Для примера будем выводить новости.
Весь функционал опирается на возможность в sql делать выборку по лимиту, для этого в запрос добавляется ключевое слово — LIMIT. Limit может принимать два параметра rows и offset. Выглядеть это будет примерно так:
В этом запросе мы достаем из таблицы table 10 записей, начиная с пятой.
Теперь применим возможности limit для написания пагинатора.
Для начала нужно создать таблицу, с тестовыми данными, можете применить этот патч:
Теперь напишем php код, который будет отвечать за логику выборки данных и построение пагинатора:
Код скрипта db_connection.php:
Теперь сделаем вывод данных и пагинатора в браузере:
Вот и все, пагинатор готов. Скачать исходники можно тут
Пагинатор. Постраничный вывод данных на php: 9 комментариев
вот бы тоже самое только с базой на текстовых файлах
разбиваешь через explode и вперед
Спасибо, все очень просто и понятно.
например у меня есть статья, которая представляет из себя html файл
и мне нужно организовать постраничный вывод статьи..
p.s. нужен пример пагинатора без СУБД
Спасибо Вам большое! Ваша статья — лучшее, что я смог найти по пагинаторам.
Отличный и простой пагинатор, я еще новичок в php но в свой двиг впаял его как надо. Огромное спасибо за то что выложили хороший скрипт. Подскажите вот какой момент, а если на сайте 100.000 файлов, выдаст слишком много страниц, как это дело все компактно сделать?
Нужно условие делать для вывода количества номеров страниц — первые 2-3 штуки, последние 2-3, активная ссылка, активная минус один и активная плюс один.
тогда красиво получится, что-то типо такого: 1 2 3 … 6 7 8 … 500 501 502
Можете пожалуйста скинуть в добавок и код с условием думаю очень многим новичкам пригодиться. Я вот искал долго пагинатор, на всех сайтах сложные замороченные а у вас самый дельный плюс еще хорошо что сразу с выводом файлов, но думаю компактность будет нелишней. Дополните пожалуйста статью если нетрудно, а то я сам поламаю свой код:-) Ищу вот еще поиск хороший на php что бы искать к примеру по titles в базе, есть у вас статьи по теме?