Comments 21
P.S. Ну и изобретать велосипеды, когда есть более качественные, удобные и надёжные решения: github.com/illuminate/pagination
Laravel хорош, но его компонент пагинации отдельно от фреймворка весьма громоздкий и не удобный.
Я советую Pagerfanta: простой пагинатор на PHP, который решает сразу 3 задачи: получение порции данных (например из БД) для отображения на странице, подсчёт количества страниц и рендер самого пагинатора.
или это только одна из его возможностей?
Не обязательно получать все записи сразу. Pagerfanta получает информацию для постраничного вывода через адаптер. У интерфейса адаптера 2 метода: «вернуть количество записей» и «вернуть N записей начиная с M-ной записи». БД-адаптеры берут из базы данных ровно те записи, которые нужны для текущей страницы. Есть ещё массив-адаптер, в который подаются все записи сразу, но это не самый оптимальный путь, лучше сделать адаптер для своего источника данных, если его нет среди готовых.
Вот я как раз и хочу поделиться своим решением данной задачи.Но зачем? Чем чаще люди сталкиваются с задачей, тем чаще она находит решение в велосипедах. Пагинаторов на просторах интернетов тьма, с адекватным оформлением, тестами, документацией и прочими плюшками. Нет, надо в который раз выставить PHP сообщество макаками у клавиатур и запостить свой слепленный на коленках агрегат на всеобщее обозрение. Зачем?
На вопрос «зачем» — как минимум я получил отзывы и мнение более продвинутых товарищей, а так же получил направление в котором следует двигаться и развиваться.
2. Внезапный и бесполезный редирект
3. Смешение логики и представления
4. Отрезать руки за
if( $this->next_prev ) $list = $this->get_item( $this->current_page > 1 ? $this->current_page - 1 : 1, $this->prev_title, true ) . $list . $this->get_item( $this->current_page < $count_pages ? $this->current_page + 1 : $count_pages, $this->next_title, true );
Sandev На этом, пожалуй, всё. Буду рад любой конструктивной критике.
Рекомендую ознакомиться: https://toster.ru/q/276441#answer_723827, там я описывал, на что стоит обращать внимание при проверке кода
Что плохо в вашем коде, при самом не пристальном взгляде
- PSR не поддерживаете
- Про SOLID (SRP особенно) не слышали: ваш навигатор — это роутер + шаблонизатор + генератор урлов + контроллер
- Используете супеглобальные переменные, про это статей написано много
- Параметры расчета захардкожены. Например, нет возможности показать по 4 страницы справа и слева от текущей, для этого нужно менять ваш код.
Если воспринимать ваш класс как учебный и как выше вы написали "начинающим от начинающих", то вот вам хелп от меня.
https://gist.github.com/anonymous/782f852d8528c53c2f3958ed8278b519
Взял ваш класс. Прогнал автоформатером кода в IDE. Сменил объявление полей класса с var
(php4 стиль) на нормальный public
. Сменил через рефакторинг стиль именования методов, параметров метадов и полей со snake_case на camelCase. Поправил докблоки. Убрал "мусорные" символы перевода строки и табуляции в шаблонах (они не чем особо не помогают, а вот сам код засоряют). Ну и главное, определил что данный класс только строит нам код пагинации (например он у вас не определяет текущую страницу) и тогда я дал ему более корректное имя. И убрал самое плохое что было в этом классе — выставление заголовков для редиректа и die. И в случаях некорректных входных данных сделал выброс исключений. Ну и там что то еще наверное делал)
Еще нужно разнести длинный метод билда на подметоды. Убрать паблик параметры, добавив где нужно сеттеры и геттеры.
Постраничная навигация на PHP