Laravel: интернет магазин ч.18: Pagination, QueryBuilder, Фильтры

Поделиться
HTML-код
  • Опубликовано: 28 сен 2024
  • - Добавляем постраничный вывод товаров
    - Добавляем фильтры для вывода товаров
    - Завязываем фильтры товаров с постраничным выводом
    - Реализуем "сброс" фильтров
    Серия практических лекций для начинающих изучать PHP Framework Laravel на примере создания интернет магазина с нуля.
    Конечный пример:
    Ссылка на репозиторий:
    github.com/war...
    commit: c8be83f941f32729305692abbe77848690a0a8b0
    ★★★★★Поддержать канал:★★★★★
    карта Альфа-банк: 4790 8723 2274 1966

Комментарии • 59

  • @androidiosgameplay-anrad7256
    @androidiosgameplay-anrad7256 2 года назад +3

    Кто работает с vue и надо чтобы строка запроса на разных страницах не пропадала делать надо на стороне сервера yourquery->paginate(6)->withQueryString();

  • @Romthalas
    @Romthalas 4 года назад

    Добрый день, Роман! У меня один вопрос возник, в 13 серии мы скопировали все в Class 'App\Models\' и при переходе Панель администратора->Товары он выдает:
    Error
    Class 'App\Models\Product' not found
    Типо модели продукт нет. хотя модель Product там есть. Не пойму в чем дело, где-то ссылка на модель не указана?

    • @rdavydov
      @rdavydov  4 года назад +1

      Скорее всего или вы что-то изменили, или не трогали после этого composer и класс не проиндексирован. composer dump-autoload скорее всего решит проблему.

  • @Sky_heaven_
    @Sky_heaven_ 4 года назад +6

    На счет пагинации, можно еще проще: $products->withQueryString()->links(), то есть просто добавив withQueryString() и всё=)

  • @vladgromov9213
    @vladgromov9213 4 года назад +2

    После введения валидации классом "ProductsFilterRequest" перестали работать фильтры по отдельности, чтобы фильтр заработал, необходимо обязательно указать значения "от" и "до".
    Фильтры по "хит|новинка|рекомендованный" отдельно без введения цен "от" и "до" не работают.

    • @vladgromov9213
      @vladgromov9213 4 года назад +5

      В начале 20 урока есть решение данной проблемы, вопрос снят.

  • @prakctoleb1974
    @prakctoleb1974 3 года назад +1

    Вместо "getQueryString" можно использовать метод "getUri" того же request, в этом случае не нежно будет конкатенировать знак вопроса

  • @LivenightQuantumisme
    @LivenightQuantumisme 3 года назад +2

    У меня почему-то выводит только стрелки pref и next вместо квадратов как будто я использую simplepaginate, но это не так. Что это может быть?

    • @rdavydov
      @rdavydov  3 года назад

      Bootstrap подключен и точно в коде не простая пагинация?

    • @LivenightQuantumisme
      @LivenightQuantumisme 3 года назад

      @@rdavydov абсолютно точно. Вёрстку скопировал с сайта, она нормально выводится

    • @rdavydov
      @rdavydov  3 года назад

      @@LivenightQuantumisme я ща не у компа... Может в новой версии чего поменяли? В документации ничего не сказано? И версия у вас какая? 8я или с моего репозитория брали ?

    • @LivenightQuantumisme
      @LivenightQuantumisme 3 года назад +1

      @@rdavydov проблема больше не актуальна. Как я её решил. Во первых, я провёл ревизию всех шаблонов пагинации и сравнил их с тем что выдаёт мне код элемента. Пришёл к выводу что ларавель изменяет бутстрапу и ему больше понравился tailwind шаблон. Ну и как бы пришлось скопировать код шаблона бутстрап в код шаблона тейлвинд. Не знаю, насколько это правильно, но теперь всё работает как надо

    • @rdavydov
      @rdavydov  3 года назад +1

      @@LivenightQuantumisme по идее в параметрах пагинации можно выбрать шаблон и по-умоочанию раньше шел бутстраповский. Видимо он больше не деыолтный, но остаться то он должен был

  • @HDKinoCool
    @HDKinoCool 4 года назад +4

    Огромное спасибо вам ха уроки!! С радостью смотрю и учусь! продолжайте пожалуйста ваше благое дело!

    • @marshallkorbyn2410
      @marshallkorbyn2410 3 года назад

      I know I'm kind of off topic but do anybody know a good site to stream new tv shows online ?

    • @kamrynrory2629
      @kamrynrory2629 3 года назад

      @Marshall Korbyn i use FlixZone. You can find it on google :)

    • @melvinroyal1373
      @melvinroyal1373 3 года назад

      @Kamryn Rory yea, have been watching on flixzone for months myself =)

    • @marshallkorbyn2410
      @marshallkorbyn2410 3 года назад

      @Kamryn Rory Thank you, I signed up and it seems to work :D I really appreciate it!!

    • @kamrynrory2629
      @kamrynrory2629 3 года назад

      @Marshall Korbyn happy to help =)

  • @ВладимирТ-ч6ц
    @ВладимирТ-ч6ц 4 года назад +1

    Спасибо за уроки, очень познавательно.

  • @FrozenSky-z5v
    @FrozenSky-z5v 4 года назад +1

    Роман, пагинация работает корректно, но в адресной строке дублируется "page". Сделайте фильтр, перейдите на вторую страницу, а затем вернитесь обратно на первую. Вы увидите косяк в адресной строке

    • @rdavydov
      @rdavydov  4 года назад

      Ну так уберите его из параметров.

    • @FrozenSky-z5v
      @FrozenSky-z5v 4 года назад

      @@rdavydov Вы о том, чтобы убрать его от сюда $request->getQueryString() ? Регулярным выражением? ох) простите, если вопрос тупой, я ведь только учу laravel

    • @VasylPe
      @VasylPe 4 года назад +3

      @@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

  • @Durduluhin
    @Durduluhin 2 года назад

    Роман, еще вопрос. В продуктКонтроллере $products = Product::paginate(10); в auth.products.index прописал {{$products->links('pagination::bootstrap-4')}} - пагинации нет, ошибок нет. Как так? (php artisan view:clear делал)

    • @rdavydov
      @rdavydov  2 года назад

      Проверить нужно, что в $products находится

    • @Durduluhin
      @Durduluhin 2 года назад +1

      @@rdavydov Нашел ошибку - был пропуск в id товаров и я думал что в списке 11, а реально было 10

  • @ДенисТ-ю9я
    @ДенисТ-ю9я 4 года назад

    Добрый день, не могу сообразить с пагинацией, подскажите пжл:
    в категорию товаров...
    контроллер 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
    редактируете

    • @rdavydov
      @rdavydov  4 года назад +1

      Здравствуйте.
      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 продукты внутри контроллера уже не очень красиво. Тем более что потом эта же связь может понадобиться в будующем.

  • @ВладиславСергеевич-п6ж

    Этот код безопасен в плане уязвимостей? Снимите видео на тему, как обезопасить сайт на ларавель.

    • @rdavydov
      @rdavydov  4 года назад +1

      Да, этот код безопасен. Возможно сделаю. В целом реконмедация всегда использовать только Eloquent для запросов в БД и всегда управлять тем, что приходит в ответ (не отдавать лишнее, когда по связям может быть случайно загружено). Но последнее относится скорее к построению API

  • @Durduluhin
    @Durduluhin 2 года назад

    Роман, вы не знаете, почему у меня вместо пагинации с кнопками просто выводит « Previous Next » ?

    • @Durduluhin
      @Durduluhin 2 года назад

      Сам нашел ответ, в Ларавель 8 нужно вместо {{ $products->links() }} прописать {{$products->links('pagination::bootstrap-4')}}

    • @rdavydov
      @rdavydov  2 года назад

      Видимо дефолтно вызывается "простая" пагмнация simplePaginate

  • @ewoxer3346
    @ewoxer3346 2 года назад

    А как можно поставить checked если checkbox выведен массивом?

    • @rdavydov
      @rdavydov  2 года назад

      Не понял вопроса

    • @ewoxer3346
      @ewoxer3346 2 года назад

      @@rdavydov У меня есть элемент input[checkbox] помещённый в массив, в который выводятся категории из бд.
      Когда я пытаюсь поставить checked на выбранный элемент после ретёрна страницы - он ставит его на последний checkbox массива

    • @rdavydov
      @rdavydov  2 года назад

      @@ewoxer3346 ну так нужное имя подставить в скобки

  • @alex-tretyakov
    @alex-tretyakov 4 года назад

    А как добавить пагинацию в категорию товаров?

    • @rdavydov
      @rdavydov  4 года назад

      Совершенно также по аналогии

    • @alex-tretyakov
      @alex-tretyakov 4 года назад

      @@rdavydov Что-то по аналогии у меня не выходит ( Товары при просмотре категории получаются во view в цикле @foreach($category->products as $product), как тут сделать пагинацию не пойму

    • @rdavydov
      @rdavydov  4 года назад +1

      В контроллере нужно найти товары, то есть $products = $category->...->paginate(10)
      И дальше все по аналогии. Желательно не нагружать представление кодом

    • @alex-tretyakov
      @alex-tretyakov 4 года назад +1

      @@rdavydov Спасибо, разобрался

    • @nouracea
      @nouracea Год назад

      @@rdavydov а как добавить сортировку и на страницах с категориями а не только в "Все товары"? или это будет позже в видеоуроке

  • @АлександрДмитриев-я2з

    Добрый вечер, есть форма с select, который multiple. В итоге, если выбрано несколько элементов, они формируют строку как: ?foo=1&foo=2&foo=3. Можно ли как-то перевести к виду ?foo=1|2|3 или ?foo=1,2,3. Уже несколько дней сижу с этим, не подскажете как примерно реализовать или в каком направлении копать?

    • @rdavydov
      @rdavydov  4 года назад

      В каком смысле перевести к этому виду? Так, вы берёте $request->foo - это будет массив. И его приводите к чему хотите. Например через implode(',', $request->foo). Предварительно можно проверить, что это в принципе массив. Только в целом, если этосвязка с какими-то сущностями - лучше их каждую отдельно хранить. То есть связь один ко многим использовать. К одной сущности (что редактируете) привязываются несколько foo-сущностей.

    • @rdavydov
      @rdavydov  4 года назад

      Хотя скорее всего я вопрос понял не совсем верно. Если передавать таким образом - предыдущие параметры затрутся. Обычно в таком случае делают название поля как foo[] (то есть указать, что это будет массив), и тогда будет ?foo[]=1&foo[]=2 что будет дальше на бэке восприниматься как массив.

    • @АлександрДмитриев-я2з
      @АлександрДмитриев-я2з 4 года назад

      @@rdavydov спасибо, сделал через массив, вроде как работает)

  • @GigaHertZ28
    @GigaHertZ28 3 года назад +1

    У Product есть метод query, мы его будет использовать.
    Ага, понятно. И так весь курс.