Laravel: интернет магазин ч.18: Pagination, QueryBuilder, Фильтры
HTML-код
- Опубликовано: 28 сен 2024
- - Добавляем постраничный вывод товаров
- Добавляем фильтры для вывода товаров
- Завязываем фильтры товаров с постраничным выводом
- Реализуем "сброс" фильтров
Серия практических лекций для начинающих изучать PHP Framework Laravel на примере создания интернет магазина с нуля.
Конечный пример:
Ссылка на репозиторий:
github.com/war...
commit: c8be83f941f32729305692abbe77848690a0a8b0
★★★★★Поддержать канал:★★★★★
карта Альфа-банк: 4790 8723 2274 1966
Кто работает с vue и надо чтобы строка запроса на разных страницах не пропадала делать надо на стороне сервера yourquery->paginate(6)->withQueryString();
Добрый день, Роман! У меня один вопрос возник, в 13 серии мы скопировали все в Class 'App\Models\' и при переходе Панель администратора->Товары он выдает:
Error
Class 'App\Models\Product' not found
Типо модели продукт нет. хотя модель Product там есть. Не пойму в чем дело, где-то ссылка на модель не указана?
Скорее всего или вы что-то изменили, или не трогали после этого composer и класс не проиндексирован. composer dump-autoload скорее всего решит проблему.
На счет пагинации, можно еще проще: $products->withQueryString()->links(), то есть просто добавив withQueryString() и всё=)
После введения валидации классом "ProductsFilterRequest" перестали работать фильтры по отдельности, чтобы фильтр заработал, необходимо обязательно указать значения "от" и "до".
Фильтры по "хит|новинка|рекомендованный" отдельно без введения цен "от" и "до" не работают.
В начале 20 урока есть решение данной проблемы, вопрос снят.
Вместо "getQueryString" можно использовать метод "getUri" того же request, в этом случае не нежно будет конкатенировать знак вопроса
У меня почему-то выводит только стрелки pref и next вместо квадратов как будто я использую simplepaginate, но это не так. Что это может быть?
Bootstrap подключен и точно в коде не простая пагинация?
@@rdavydov абсолютно точно. Вёрстку скопировал с сайта, она нормально выводится
@@LivenightQuantumisme я ща не у компа... Может в новой версии чего поменяли? В документации ничего не сказано? И версия у вас какая? 8я или с моего репозитория брали ?
@@rdavydov проблема больше не актуальна. Как я её решил. Во первых, я провёл ревизию всех шаблонов пагинации и сравнил их с тем что выдаёт мне код элемента. Пришёл к выводу что ларавель изменяет бутстрапу и ему больше понравился tailwind шаблон. Ну и как бы пришлось скопировать код шаблона бутстрап в код шаблона тейлвинд. Не знаю, насколько это правильно, но теперь всё работает как надо
@@LivenightQuantumisme по идее в параметрах пагинации можно выбрать шаблон и по-умоочанию раньше шел бутстраповский. Видимо он больше не деыолтный, но остаться то он должен был
Огромное спасибо вам ха уроки!! С радостью смотрю и учусь! продолжайте пожалуйста ваше благое дело!
I know I'm kind of off topic but do anybody know a good site to stream new tv shows online ?
@Marshall Korbyn i use FlixZone. You can find it on google :)
@Kamryn Rory yea, have been watching on flixzone for months myself =)
@Kamryn Rory Thank you, I signed up and it seems to work :D I really appreciate it!!
@Marshall Korbyn happy to help =)
Спасибо за уроки, очень познавательно.
Роман, пагинация работает корректно, но в адресной строке дублируется "page". Сделайте фильтр, перейдите на вторую страницу, а затем вернитесь обратно на первую. Вы увидите косяк в адресной строке
Ну так уберите его из параметров.
@@rdavydov Вы о том, чтобы убрать его от сюда $request->getQueryString() ? Регулярным выражением? ох) простите, если вопрос тупой, я ведь только учу laravel
@@FrozenSky-z5v я пофиксал так:
1) В MainController:
Заменить $products = $productsQuery->paginate(5)->withPath("?" . $request->getQueryString()); на просто $products = $productsQuery->paginate(5);
тоесть удалить >withPath("?" . $request->getQueryString()).
2) В views/index.blade.php в $products->links() добавить appends() метод. Тоесть нужно чтобы было так:
{{ $products->appends([
'price_from' => request()->price_from,
'price_to' => request()->price_to,
'hit' => request()->hit,
'new' => request()->new,
'recommend' => request()->recommend,
])->links()}}
Смотрите в документации Laravel->Appending To Pagination Links laravel.com/docs/6.x/pagination#displaying-pagination-results
Роман, еще вопрос. В продуктКонтроллере $products = Product::paginate(10); в auth.products.index прописал {{$products->links('pagination::bootstrap-4')}} - пагинации нет, ошибок нет. Как так? (php artisan view:clear делал)
Проверить нужно, что в $products находится
@@rdavydov Нашел ошибку - был пропуск в id товаров и я думал что в списке 11, а реально было 10
Добрый день, не могу сообразить с пагинацией, подскажите пжл:
в категорию товаров...
контроллер joxi.ru/823LY1EHDJQoNA
модель joxi.ru/EA4KY7juOw5dY2
куда добавить paginate(4)
------------------------------------------------------------------------
А если сделать так, то все получается, но автор видео говорит что контроллер будет перегружен (принцип единственной ответственности):
в модели удалил функцию product()
контроллер joxi.ru/52anpqEUb4RoDA
------------------------------------------------------------------------
Кому нужно отредактировать paginate, находите файл
сайт.ru\vendor\laravel\framework\src\Illuminate\Pagination
esources\views\bootstrap-4.blade
редактируете
Здравствуйте.
1. Никогда не редактируйте ничего в папке vendor. Как только вы этот код решите установить в другом месте - вендор будет новый/чистый, без ваших изменений и ваш функционал не будет работать. Или, если вы перетащите вендора, то, к примеру, проект может не запуститься из-за разных версий PHP/библиотек/операционных систем. Для редактирования пагинации можно добавлять свои шаблоны или "опубликовать" встроенные в Laravel для их дальнейшего редактирования:
php artisan vendor:publish --tag=laravel-pagination
После этого вы найдёте файлы в esources/views/vendor/pagination
И потом можно глобально зарегистрировать нужный шаблон для пагинации через AppServiceProvider
laravel.com/docs/master/pagination#customizing-the-pagination-view
2. Называйте функции/переменные понятнее. Например, функция product (являющаяся связью) возвращать должна много продуктов а не один. То есть лучше её назвать products.
3. Пагинация в данном случае в контроллере особо высокой смысловой нагрузки на контроллер как мне кажется не несёт, вполне может находиться там же. Но вот убрать связь и искать через where продукты внутри контроллера уже не очень красиво. Тем более что потом эта же связь может понадобиться в будующем.
Этот код безопасен в плане уязвимостей? Снимите видео на тему, как обезопасить сайт на ларавель.
Да, этот код безопасен. Возможно сделаю. В целом реконмедация всегда использовать только Eloquent для запросов в БД и всегда управлять тем, что приходит в ответ (не отдавать лишнее, когда по связям может быть случайно загружено). Но последнее относится скорее к построению API
Роман, вы не знаете, почему у меня вместо пагинации с кнопками просто выводит « Previous Next » ?
Сам нашел ответ, в Ларавель 8 нужно вместо {{ $products->links() }} прописать {{$products->links('pagination::bootstrap-4')}}
Видимо дефолтно вызывается "простая" пагмнация simplePaginate
А как можно поставить checked если checkbox выведен массивом?
Не понял вопроса
@@rdavydov У меня есть элемент input[checkbox] помещённый в массив, в который выводятся категории из бд.
Когда я пытаюсь поставить checked на выбранный элемент после ретёрна страницы - он ставит его на последний checkbox массива
@@ewoxer3346 ну так нужное имя подставить в скобки
А как добавить пагинацию в категорию товаров?
Совершенно также по аналогии
@@rdavydov Что-то по аналогии у меня не выходит ( Товары при просмотре категории получаются во view в цикле @foreach($category->products as $product), как тут сделать пагинацию не пойму
В контроллере нужно найти товары, то есть $products = $category->...->paginate(10)
И дальше все по аналогии. Желательно не нагружать представление кодом
@@rdavydov Спасибо, разобрался
@@rdavydov а как добавить сортировку и на страницах с категориями а не только в "Все товары"? или это будет позже в видеоуроке
Добрый вечер, есть форма с select, который multiple. В итоге, если выбрано несколько элементов, они формируют строку как: ?foo=1&foo=2&foo=3. Можно ли как-то перевести к виду ?foo=1|2|3 или ?foo=1,2,3. Уже несколько дней сижу с этим, не подскажете как примерно реализовать или в каком направлении копать?
В каком смысле перевести к этому виду? Так, вы берёте $request->foo - это будет массив. И его приводите к чему хотите. Например через implode(',', $request->foo). Предварительно можно проверить, что это в принципе массив. Только в целом, если этосвязка с какими-то сущностями - лучше их каждую отдельно хранить. То есть связь один ко многим использовать. К одной сущности (что редактируете) привязываются несколько foo-сущностей.
Хотя скорее всего я вопрос понял не совсем верно. Если передавать таким образом - предыдущие параметры затрутся. Обычно в таком случае делают название поля как foo[] (то есть указать, что это будет массив), и тогда будет ?foo[]=1&foo[]=2 что будет дальше на бэке восприниматься как массив.
@@rdavydov спасибо, сделал через массив, вроде как работает)
У Product есть метод query, мы его будет использовать.
Ага, понятно. И так весь курс.