|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
|||||||||||||||||||||
Органицация пагинации04.07.2020, 23:48. Показов 3768. Ответов 31
Метки нет (Все метки)
Наваял свой первый пагинатор. Сначала естественно в процедурном стиле, потом еще половина этого времени ушло, чтобы пееформатировать в ООП. С этим конечно возникли сложности, т.к. для себя я вижу разные варианты, непонятно как правильно/грамотно. Ну и сами вопросы по реализации, большей частью по представлению.
Выглядит и функционирует это конечно примитивно, но функции свои выполняет: Реализовал так: Во фронт-контроллере вызываю основной контроллер(для вывода статей) и получаю объект пагинатора, который с объектом статьи и комментариев рендерятся в страничку представления: Кликните здесь для просмотра всего текста
Пагинатор реализовал отдельным классом с конструктором и методом получения строки пагинатора с адресами. Кликните здесь для просмотра всего текста
Тут конечно у меня своя логика, хотя нюансов хоть отбавляй)) Возможно многим покажется странным, непонятным, нелогичным, но оно работает. Представление, наверное самое несуразное, тут сама строка пагинатора: Кликните здесь для просмотра всего текста
и кучка вопросов: В части контроллера: 1. насколько корректно несколькими маршрутами отправлять на одну и ту же страничку? Страничка одна, а адресов несколько. Эту "проблему " не знал как по другому решить. Т.к. главная страничка - это первая страничка со статьями. А при постраничном вводе нужно как -то в составе стандартных ссылок пагинатора отправлять на первую страничку(/blog/1) = главную(/). Поэтому в контроллере задал "дефолтный" параметр. чтобы и через пагинатор можно было перейти на первую страничку и через ссылку "HOME". Количество статей на экран - опция выбора пользователем, пока захардкодил. В части самого пагинатора: 2. Нужно ли тут вообще делать конструктор(субъективно, не вижу пока в нем необходимости, может для чего то пригодится в будущем) или оставить один метод, в который передавать параметры вместо конструктора? 3. Количество видимых страниц в строке пагинаора тоже захардкодил. Не знаю, как с ним поступать. Необходимость в такой опции - наверное скорее - экзотика и только для админа. В коде - для прямого программирования этой опции - достаточно только один раз изменить значение в методе. В части представления: 4.Тут какая-то куча-мала... груда однотипных обращений к объектам, сам читаю и дурно становится. Может хоть где-то в начале представления пагинатора выполнить типа инициализацию объекта пагинатора и установить какие-то короткие, читаемые названия, получив в них данные через геттеры, как сделано для переменной $start в цикле? 5. на счет
но наверное все таки было бы как минимум лучше сделать через CSS (before/after)? Ну и в целом - насколько все плохо?)
0
|
|||||||||||||||||||||
| 04.07.2020, 23:48 | |
|
Ответы с готовыми решениями:
31
Не отображается вторая страницы пагинации
|
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
|||
| 07.07.2020, 16:19 [ТС] | |||
|
0
|
|||
|
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,896
|
|
| 07.07.2020, 19:48 | |
|
А зачем шаблон привязывать к адресации? Чтобы каждый раз его править под конкретные адреса?
Добавлено через 5 минут И опять-таки без этого вы теряете возможность повторного использования кода с разметкой. Например, уже не сможете использовать один и тот же шаблон для формирования страниц с абсолютными адресами /blog/ и /news/, а я внутри функции pagelink(1) могу это делать.
0
|
|
|
2604 / 1508 / 689
Регистрация: 23.08.2015
Сообщений: 3,834
|
|||||||||||||||||||||||||||||||
| 11.07.2020, 00:06 | |||||||||||||||||||||||||||||||
|
Тут можно немного порассуждать. С таким подходом мы могли бы просто передать $totalCount, $currentPage и $limit, а верстальщик все рассчитает. И у нас шаблон получится с кучами формул. Не знаю на сколько это правильно.
Возможно мой вариант не лучший. Так как мы жестко фиксируем количество выводимых страниц, а это уже дизайн, т.е. нарушается принцип единой ответственности. Так же, мы бы могли рассчитать $start и $end в конструкторе класса, таким образом реализация всех остальных методов бы значительно упростилась. С другой стороны количество выводимых элементов на странице - это тоже можно отнести к дизайну, однако мы не можем так просто полностью возложить эту ответственность на frontend. А от $limit зависит и общее кол-во страниц. Далее, что касается генерации ссылок. Если мы говорим об ООП, а если у нас MVC, то это должно быть ООП. То это не может быть простой функцией или статическим методом какого-нибудь хэлпера, ведь это не какой-нибудь number_format и т.д. Нам нужны доступы к роутеру, конфигам и т.д. Функции мы можем вызвать где угодно, что не очень хорошо, так как это нарушает принципы ООП. За генерацию ссылок должен отвечать отдельная служба - UrlManager. Допустим у нас есть класс, который умеет генерировать ссылки. Где мы передаем название роута, и параметры.
Можно и добавить метод, который будет брать текущий роут
Обращаю внимание, что при переходе по пагинации у нас должны именно заменяться GET параметр page, все остальные get параметры должны оставаться. К примеру это может быть каталог товаров с фильтрами, сортировкой и т.д. Где все передается именно через GET параметры, и мы не должны их потерять при переходе по страницам пагинации. Вопрос в том, как получить нам доступ внутри вьюхи, при этом не используя функции? На самом деле все сводится к архитектуре нашего приложения... Давайте рассмотрим класс Renderer
1
|
|||||||||||||||||||||||||||||||
|
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,896
|
|||||
| 11.07.2020, 09:43 | |||||
|
Добавлено через 7 минут Но программисты, использующие языки, в которых в принципе нет ООП, могут подумать, что их MVC - и не MVC вовсе
0
|
|||||
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
||||
| 11.07.2020, 17:47 [ТС] | ||||
|
Спасибо за примеры!!
0
|
||||
|
2604 / 1508 / 689
Регистрация: 23.08.2015
Сообщений: 3,834
|
||||||||||||||||||||||||||
| 11.07.2020, 19:59 | ||||||||||||||||||||||||||
|
СергейСереб, Давайте немного порассуждаем.. Я не рассматриваю с точки зрения человека "верстальщика" или человека "backender-a". Для меня важнее написать код, который хотя бы не нарушал принципы ООП. В моей вселенной существует единственный правильный вариант, все остальные являются компромиссами, только нужно его найти)
Если пользователь введет в адресную строку 100 страницу, а у нас страниц всего 10. Что мы должны показать? 404 ошибку или сообщение, что записей нет. Чаще всего показывают последнюю страницу, при этом в пагинации она должна быть активной, именно поэтому у меня в методе есть коррекция текущей страницы
[1] ... [25][26][27][28][29][30] ... [100][101][102] ... [260] Причем и в контексте одного сайта на разных страницах он может выводиться по разному. Поэтому я не думаю, что его нужно наделять логикой по сколько страниц выводить и т.д. Что-то подсказывает, что для вывода должен быть отдельный специальный инструмент. Тут получается идеологический вопрос, вывод пагинации - это что? К примеру в некоторых книжках упоминалось о таком компоненте, как Презентатор. Где по аналогии с операционным слоем, где выносятся все операции, точно так же выносится логика формирования данных для вывода в отдельный класс, что позволяет нам его протестировать обособленно от http запросов и html верстки. А далее данные которые он возвращает их можно передать в ответе в разных форматах, как json или html шаблон. Или даже сформировать какой-нибудь xml или pdf) Таким образом контроллер бы уже не отвечал за логику формирования данных для вывода, а только обрабатывал запрос, передавая управление в разные компоненты нашей системы, причем мы должны учитывать, что логика формирования данных может быть толстой... Я никогда не пробовал внедрять такой подход в систему, мне представляется что это должно выглядеть примерно так
Т.е. это еще один отдельный слой, и там упоминалось, что он должен формировать данные со всеми названиями кнопок, их статусами и т.д... Вот и вопрос, в каком виде нам нужно отдавать данные для вывода пагинации. Достаточно ли нам отдать $currentPage и $totalCount, или мы должны отдать что типа такого
Если проводить аналогию, то что у нас получается? логика вывода должна полностью ложиться на html шаблон и на инструменты Renderer-а? Хотя возможно такой ход рассуждения и не совсем корректный)
0
|
||||||||||||||||||||||||||
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
||||||
| 11.07.2020, 23:15 [ТС] | ||||||
|
Чисто технический нюанс...
Хотя изменить логику его представления не составит никакого труда, т.к. основные моменты уже учтены. Зато усложнился код и потерялась универсальность В принципе нечто подобное, как я себе это представил)) у меня реализовано с обратной стороны. на низком уровне - на уровне моделей, в виде ActiveRecord, как общего интерфейса для работой с БД.
0
|
||||||
|
2604 / 1508 / 689
Регистрация: 23.08.2015
Сообщений: 3,834
|
||||||||
| 12.07.2020, 00:54 | ||||||||
|
Добавлено через 10 минут СергейСереб, Тут скорее смысл именно в написании тестов, данный класс проще протестировать, когда он принимает и возвращает максимально простые данные. И вам не нужно эмулировать запрос, и проверять html верстку. А когда меняется html верстка, то не нужно переписывать тесты. Добавлено через 3 минуты Добавлено через 25 минут Добавлено через 22 минуты Скорее всего он будет использовать совокупность разных ReadRepository для формирования данных. ActiveRecord - это объект строки базы данных. А данные мы можем доставать не только из БД. В этом и заключается смысл ReadRepository. Мы абстрагируемся от реализации получения данных. Главное что мы дергаем $this->articles->list() и чтоб он вернул массив статей, а как он это делает и откуда берет нам не важно. Мы можем использовать кеш или noSQL, к примеру ElasticSearch или Redis - как правило это все идет в совокупности. И в любой момент мы можем оптимизировать запросы.
0
|
||||||||
|
Невнимательный
|
||
| 12.07.2020, 06:58 | ||
|
Не по теме:
Которые могут переопределяться настройками модуля. Которые могут переопределяться настройками темы/шаблона, Которые в свою очередь должна быть возможность переопределять , в соответствии с предпочтениями любого отдельно взятого посетителя :) Добавлено через 11 минут
0
|
||
|
2604 / 1508 / 689
Регистрация: 23.08.2015
Сообщений: 3,834
|
|
| 12.07.2020, 07:14 | |
|
x_lab, У вас есть дизайн, где выводится по 20 элементов). Вы можете задать размер при получении данных. И зачем тут какие-то настройки модуля, какой смысл возможности их переопределения? Я бы даже не стал задумываться на этот счет)
Добавлено через 6 минут x_lab, Если нужна возможность выбирать кол-во записей на странице, то это как правило это какой-нибудь select, который передает значение в качестве GET параметров. В любом случае тут некие настройки вообще не причем)
0
|
|
|
1310 / 1002 / 232
Регистрация: 01.10.2018
Сообщений: 3,896
|
||
| 12.07.2020, 10:26 | ||
|
0
|
||
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
|||||
| 13.07.2020, 14:10 [ТС] | |||||
|
0
|
|||||
| 13.07.2020, 14:10 | |
|
Помогаю со студенческими работами здесь
32
Неправильно выводит количесвто страниц в пагинации Как прописать условие,чтоб не было лишних ссылок пагинации? Создание пагинации Улучшение моей пагинации Изменение формы пагинации на JS Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|