|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
|||||||||||||||||||||
Органицация пагинации04.07.2020, 23:48. Показов 3725. Ответов 31
Метки нет (Все метки)
Наваял свой первый пагинатор. Сначала естественно в процедурном стиле, потом еще половина этого времени ушло, чтобы пееформатировать в ООП. С этим конечно возникли сложности, т.к. для себя я вижу разные варианты, непонятно как правильно/грамотно. Ну и сами вопросы по реализации, большей частью по представлению.
Выглядит и функционирует это конечно примитивно, но функции свои выполняет: Реализовал так: Во фронт-контроллере вызываю основной контроллер(для вывода статей) и получаю объект пагинатора, который с объектом статьи и комментариев рендерятся в страничку представления: Кликните здесь для просмотра всего текста
Пагинатор реализовал отдельным классом с конструктором и методом получения строки пагинатора с адресами. Кликните здесь для просмотра всего текста
Тут конечно у меня своя логика, хотя нюансов хоть отбавляй)) Возможно многим покажется странным, непонятным, нелогичным, но оно работает. Представление, наверное самое несуразное, тут сама строка пагинатора: Кликните здесь для просмотра всего текста
и кучка вопросов: В части контроллера: 1. насколько корректно несколькими маршрутами отправлять на одну и ту же страничку? Страничка одна, а адресов несколько. Эту "проблему " не знал как по другому решить. Т.к. главная страничка - это первая страничка со статьями. А при постраничном вводе нужно как -то в составе стандартных ссылок пагинатора отправлять на первую страничку(/blog/1) = главную(/). Поэтому в контроллере задал "дефолтный" параметр. чтобы и через пагинатор можно было перейти на первую страничку и через ссылку "HOME". Количество статей на экран - опция выбора пользователем, пока захардкодил. В части самого пагинатора: 2. Нужно ли тут вообще делать конструктор(субъективно, не вижу пока в нем необходимости, может для чего то пригодится в будущем) или оставить один метод, в который передавать параметры вместо конструктора? 3. Количество видимых страниц в строке пагинаора тоже захардкодил. Не знаю, как с ним поступать. Необходимость в такой опции - наверное скорее - экзотика и только для админа. В коде - для прямого программирования этой опции - достаточно только один раз изменить значение в методе. В части представления: 4.Тут какая-то куча-мала... груда однотипных обращений к объектам, сам читаю и дурно становится. Может хоть где-то в начале представления пагинатора выполнить типа инициализацию объекта пагинатора и установить какие-то короткие, читаемые названия, получив в них данные через геттеры, как сделано для переменной $start в цикле? 5. на счет
но наверное все таки было бы как минимум лучше сделать через CSS (before/after)? Ну и в целом - насколько все плохо?)
0
|
|||||||||||||||||||||
| 04.07.2020, 23:48 | |
|
Ответы с готовыми решениями:
31
Не отображается вторая страницы пагинации
|
|
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
|
||||||||||||||||||||||||||
| 05.07.2020, 00:16 | ||||||||||||||||||||||||||
Сообщение было отмечено СергейСереб как решение
Решение
СергейСереб, Объект пагинации нужен, чтоб хранить основную логику внутри, а вы делаете часть рассчетов снаружи - это ошибка.
Для организации пагинации нам необходимо знать общее кол-во элементов, поэтому потребуется сделать запрос дважды, один раз выбрать COUNT(id), второй раз уже используя LIMIT И OFFSET. Для расчета LIMIT и OFFSET нам как раз и потребуется объект пагинации. который внутри будет хранить логику расчетов.
Код не проверял, накидал "на коленке". Главное чтоб была понятна основная идея.
0
|
||||||||||||||||||||||||||
|
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,882
|
||||
| 05.07.2020, 09:28 | ||||
|
Как выше в общем-то уже написали, для пагинации нужны две основные функции: 1) count($col) или сразу pagecount($col,$pp=10); 2) функция получения самого списка, принимающая смещение и лимит, либо опять-таки сразу $pn (номер страницы) и $pp=10 (количество элементов на странице). Для "широкой" строки навигации, позволяющей переключаться не только на соседние страницы (и "крайние" страницы), также нужны функции или объект для задания "ширины" строки и для вычисления значений start и end (stop как-то непривычно звучит; наверное, это семантически не самое точное слово; также можно использовать слова first и last, если у вас при использовании этих слов не возникает путаницы с первой и последней существующими страницами). Можно вычислять и сразу весь набор номеров от start до end, как показали выше, но это немного сложнее. Также, чтобы не было безобразия в разметке, конечно, нужна функция формирования адреса.
1
|
||||
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
|||||||||||||||
| 05.07.2020, 19:01 [ТС] | |||||||||||||||
|
Кое что не работало, изменил. Кое-что переделал по своему с учетом замечаний и образца. Отдельное спасибо за "напоминание" про функции min / max. Меньше кода, чем с условиями и более удобно читается, чем с if / else. Как раз в голове вертелось, как сделать такую хитроумную проверки, а сам не вспомнил, пока не увидел пример.. Если использовать. как у меня выше - многоточия и затолкать их в массив к адресам пагинатора, то в шаблоне при выводе ссылок нужно будет в нескольких местах делать проверку, является ли например элемент массива объектом или нет, чобы не применять к строковому элементу многоточия поверку на то, является ли элемент текущим. Со стрелочками назад/вперед - пока тупик - как их передавать в массиве объектов пагинатора.. Или их жестко прописывать в представлении. Но это опять же куча обращений к объекту. Сделать у объектов свойства next/prev/first/last? Вопрос не в конкретной реализации а в подходе Добавлено через 1 час 54 минуты Промежуточный полуфабрикат в контексте многоточий по краям пагинатора для тех значений, которые вне поля зрения: В самом пагинаторе: Кликните здесь для просмотра всего текста
В шаблоне: Кликните здесь для просмотра всего текста
0
|
|||||||||||||||
|
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,882
|
|||||||||||||
| 05.07.2020, 19:04 | |||||||||||||
Вот пример "узкой" строки навигации из шаблона этого демонстрационного сайта:
(Перехват исключения можно вынести во фронт-контроллер.)Добавлено через 3 минуты Ну, вы еще можете профильтровать параметр $pn. У меня он стандартный (устанавливается и фильтруется автоматически).
1
|
|||||||||||||
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
|
| 05.07.2020, 19:06 [ТС] | |
|
del
0
|
|
|
308 / 261 / 70
Регистрация: 01.12.2008
Сообщений: 1,031
|
|||||||
| 05.07.2020, 19:44 | |||||||
![]() У меня разметку навигации формируют аж семь переменных. И соответственно циклы и условия. И что же все это тащить в разметку? Когда в классе контроллера все под рукой - сформировал разметку и перекинул в шаблон одной переменной. В результате в шаблоне
0
|
|||||||
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
||||||
| 05.07.2020, 22:21 [ТС] | ||||||
|
Спасибо. Почитал про варианты пагинаторов, есть что поизучать, над чем подумать, но это как мне кажется уже - нюансы, нужно подвигаться дальше. С многоточиями пока осталось все-таки под вопросом, остановился на таком полуфабрикате шаблона пагинатора:
Кликните здесь для просмотра всего текста
0
|
||||||
|
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,882
|
||||||||||||
| 06.07.2020, 09:20 | ||||||||||||
|
При этом показанная вставка вполне допустима, если формировать значение переменной на основе файла шаблона или непосредственно функции представления, хотя использовать функцию представления для построения "больших" блоков - не самый лучший вариант, а то быстро получится WP ![]() В общем же достаточно include в шаблоне, если вы хотите повторно использовать этот блок, например:
1
|
||||||||||||
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
||
| 06.07.2020, 14:41 [ТС] | ||
$i === $this->getCurrentPage() Допустим, у меня 11 страниц. Начиная со страницы 9 текущие страницы перестают выделяться. хотя как ссылки - активные и работают. Не работает само выделение текущей страницы. Если делать поверку на не строгое соответствие все работает. Что-то я пока никак не въеду в чем причина. Сама проверка на строгое соответствие, как я понимаю и не нужна, достаточно обычного сравнения.
0
|
||
|
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
|
||||||
| 06.07.2020, 15:31 | ||||||
|
СергейСереб,
Если строгое сравнение не работает, значит вы сравниваете integer со string, то есть у вас currentPage не приведен к инту. Возможно вы убрали типизацию из конструктора или еще что-то. Надо смотреть ваш класс. Добавлено через 10 минут СергейСереб, С многоточиями конечно выглядит костыльно, метод должен возвращать массив однотипных данных. Вы можете добавить отдельные методы
1
|
||||||
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
|||||||
| 06.07.2020, 21:11 [ТС] | |||||||
$currentPage с $i сделал поверку типов и оказалось, что текущая страница то как раз целочисленного типа постоянно, а вот когда она равна 9 и до конца страниц, то $i у меня становится типом float. Этот тип приходит раньше, от переменной $start. Почему так получается, откуда там float - пока что не могу разобраться, вроде все проверил. Такая же проблема при сравнении происходит в методе getNext(). И так же начиная с текущей страницы = 9 и до последней страницы9 = общее количество страниц минус размер крыла(количество показываемых страниц от текущей). Если сравнение не строгое, то все работает. В методе getPrev() тоже строгое сравнение, но там все работает как положено.Какое то магическое числo 9... Класс пагинатора: Кликните здесь для просмотра всего текста
0
|
|||||||
|
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
|
|||||||||||
| 06.07.2020, 21:33 | |||||||||||
|
СергейСереб, float возникает при делении.
1
|
|||||||||||
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
||
| 06.07.2020, 21:45 [ТС] | ||
|
Я ведь был уверен, что раз ceil округляет до целого числа, то и возвращает целое число в формате int. Да и док-блок сбил с толку. Нет чтобы порверить в документации... Cпасибо.
0
|
||
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
|
| 07.07.2020, 13:22 [ТС] | |
|
Пока доделывал/переделывал, вспомнил такой нюанс - Насколько правильно/неправильно, принципиально/не принципиально использование разных способов работы со свойствами объекта в самом классе или в представлении? А именно, можно напрямую обратиться к свойству, а можно через геттер/сеттер. Если свойство защищенное, приватное, то понятное дело, а кроме этого есть еще ограничения если свойство публичное? Каких-то стандартов по этому поводу не видел.
0
|
|
|
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,882
|
||
| 07.07.2020, 14:10 | ||
|
Добавлено через 7 минут Условия наподобие !$pagination->isEnd() делаются гораздо проще: $pn<$pc (текущая страница сравнивается с общим количеством страниц, т.е. с номером последней). По сути для построения строки навигации на данном этапе нужны только pn, pc и, возможно, count. Для "широкой" строки - также start/end и параметр для их вычисления "range", который в общем-то можно инкапсулировать в объект или функции для получения start/end. Все остальное делается вполне понятными верстальщику сравнениями
0
|
||
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
||||||||
| 07.07.2020, 14:13 [ТС] | ||||||||
|
На сейчас, это выглядит так: Кликните здесь для просмотра всего текста
Мне пока не с чем сравнивать, т.к. никаких типовых схем я еще не видел, написал все с нуля. В интернете куча несистематизированных вариантов - все структурно отличаются друг от друга. И не сработает у меня такая проверка в моем алгоритме вывода номеров страниц, я уже такой вариант проходил. Ну и опять же, я пока на нюансах не хотел бы останавливаться. Оставляю это на потом.
0
|
||||||||
|
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,882
|
|
| 07.07.2020, 14:39 | |
|
Я прежде всего имел в виду сам объект. Сложный код строки навигации - это уже следствие. Даже методы getPrev/getNext - это уже лишняя для него информация. Неужели вы считаете, что он не сможет написать $pn-1/$pn+1?
В общем вы путаете себя, как всюду использующего объекты программиста, с верстальщиком. Если здесь все же использовать объекты, верстальщикам в радость такие конструкции: $page->number - 1, $page->number + 1, $page->number < $page->count и т.п.
1
|
|
|
39 / 9 / 10
Регистрация: 19.09.2016
Сообщений: 1,076
|
|
| 07.07.2020, 14:42 [ТС] | |
|
0
|
|
|
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,882
|
||||||||
| 07.07.2020, 15:30 | ||||||||
Не заставляйте верстальщика провоцировать дубли И про "/blog/" в шаблоне уже писал. Если не можете скрыть формирование адреса в специальной функции, делайте хотя бы так:
Хотя, как вы писали в первом сообщении, там путь тоже вариативный, поэтому константу, наверное, лучше не использовать. Добавлено через 9 минут
1
|
||||||||
| 07.07.2020, 15:30 | |
|
Помогаю со студенческими работами здесь
20
Неправильно выводит количесвто страниц в пагинации Как прописать условие,чтоб не было лишних ссылок пагинации? Создание пагинации Улучшение моей пагинации Изменение формы пагинации на JS Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|