Почему при фильтрации товаров в коллекции не пропадают ненужные характеристики фильтров на фронте?

Сейчас писал плагин по запросу клиента

https://support.webasyst.ru/fo...

Использовал хук products_collection.filter

Все товары отфильтровались замечательно, но, когда заходишь в категорию с отфильтрованными товарами, то там есть список характеристик товаров, по которым можно дополнительно фильтровать товары.


Так вот в этих фильтрах остались те характеристики, которые были только в отфильтрованных категориях. А почему? А как исправить?

21 ответ

  • 1
    Anton F 8 декабря 2021 02:33 #

    В смысле почему?  потому что фильтр строится на основании товаров коллекции. или под отфильтрованными ты подразумеваешь не попавшие в коллекцию? 

    А как исправить?

    какой результат ожидается?

    • +1
      ITFrogs ITFrogs 8 декабря 2021 06:25 #

      если у нас в результате addWhere пропали все товары с определенной характеристикой, то зачем плказывать ее в списке фильтров на фронте?

  • 1
    Anton F 8 декабря 2021 11:27 #
    в результате addWhere пропали все товары с определенной характеристикой

    А чем тебя filters() не устроил?

    Используешь getFeatureValueIds()?

    В отсутствии кода можно только гадать в чем у тебя проблема

    • +1
      ITFrogs ITFrogs 8 декабря 2021 11:34 #

      Вот собственно все, что делается в коде, кроме всяких проверок.

      if (!empty($notdesc_ids)) {    
          $collection->addWhere('p.category_id NOT IN('.implode(',', $notdesc_ids).')'); 
      }

      Товары из категорий пропадают, а характеристики этих товаров не пропадают.

      • +1
        Anton F Anton F 8 декабря 2021 14:29 #

        хук какой? данные фильтра получаешь в category.html из $filters?

        • +1
          ITFrogs ITFrogs 9 декабря 2021 20:55 #

          Хук я написал в шапке темы. Я вообще даже не смотрел что там на фронте в category.html

          Раз уж выводит все характеристики, значит так данные из коллекции передаются.

          • +1
            Anton F Anton F 10 декабря 2021 17:35 #

            туплю (:

            вообще выбирать товары по p.category_id не совсем верно т.к. товар может быть в нескольких категориях

            по каким-то неведомым причинам в действии категории прописана выборка хар-к без фильтрации

            + все это еще завязано на настройки текущей категории вроде "Разрешить фильтрацию товаров"

            т.ч. тебе придется сделать это "вручную" в шаблоне категории. Ну или автоматически сгенерировать категории-фильтры для всех возможных вариаций и подправить фильтр чтобы редиректил на них

            • +1
              ITFrogs ITFrogs 10 декабря 2021 17:52 #

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

              т.ч. тебе придется сделать это вручную, как вариант попробовать $wa->shop->features($products);

              Я вообще не хочу иметь никаких взаимодействий с фронтом. Если не получается удалить лишние фильтры при помощи коллекции, то я считаю это багом, поэтому и создал этот топик.


              Вообще класс коллекций - это какой-то ад. Мало того, что он создает 100500 запросов к базе, так еще и не отфильтровывает все, что нужно отфильтровать. Я пробовал запускать магазин с 900 тыс товаров на суперпуперском dedicated сервере хетзнера. Там, при вызове коллекции база вешает движок до таймаута в 30 секунд. В итоге пришлось свернуть этот проект.


              Надо как-то думать в сторону асинхронной загрузки фильтров, но темы дизайна как раз дергают $wa->shop->features($products); где надо и где не надо. А это самый тяжелый запрос.

              • +1
                Anton F Anton F 10 декабря 2021 18:12 #

                так ты сам задать можешь псевдоним таблицы:

                $collection->addJoin(['table' => ['alias' => ..., 'table' => ...]]);

                • +1
                  ITFrogs ITFrogs 10 декабря 2021 18:50 #

                  но не той таблицы, которая уже вшита в класс коллекции. если я сджоиню shop_category_products, то появится еще один джоин с ней же. а вот по поводу алиаса этой таблицы я не уверен, что он всегда будет cp1.

                  • +1
                    Anton F Anton F 11 декабря 2021 16:25 #

                    всегда можно создать класс наследующий productCollection заменив им исходный исходный класс.

              • +1
                Anton F Anton F 10 декабря 2021 18:20 #
                так еще и не отфильтровывает все, что нужно отфильтровать

                чем ты недоволен)))

                то я считаю это багом

                экшен категории специально передает в шаблон не фильтрованный список хар-к который базируется на настройках категории.

              • +1
                Anton F Anton F 10 декабря 2021 18:35 #
                Я пробовал запускать магазин с 900 тыс товаров на суперпуперском dedicated сервере хетзнера. Там, при вызове коллекции база вешает движок до таймаута в 30 секунд. В итоге пришлось свернуть этот проект.

                само по себе железо работать не будет, его нужно настраивать. Универсальное решение:
                1. изменяем тип таблиц на innodb и увеличиваем буферизацию mysql

                2.включаем кэширование по максимуму: сервер - модуль pagespeed , opcache, smarty и клиент- http заголовки

                • +1
                  ITFrogs ITFrogs 10 декабря 2021 18:47 #

                  Там сисадмин путевый настраивал все по феншую. Но сервер не вытянул нагрузку.

  • 1
    Aleksey Kuksov 8 декабря 2021 11:42 #

    в результате addWhere пропали все товары с определенной характеристикой. 

    Точнее наверно пропали все товары с определенной категории, а вот фильтры от пропавших товаров остались.

  • 0
    Aleksey Kuksov 8 декабря 2021 11:50 #

    Вопрос такой, как сделать так, если мы в основной категории например "Кондиционеры"  хотим исключить показ товаров из подкатегории "Комплектующие" убрать так же показ фильтров в категории "Кондиционеры" для товаров из подкатегории "Комплектующие"

    • +1
      Anton F Anton F 8 декабря 2021 14:31 #

      переместить категорию в корень)

      • +1
        Aleksey Kuksov Aleksey Kuksov 8 декабря 2021 14:45 #

        Нет)

      • +1
        Aleksey Kuksov Aleksey Kuksov 9 декабря 2021 22:17 #

        Вариантов больше нет?))

        • +1
          Anton F Anton F 10 декабря 2021 18:40 #

          решение очевидное: пишите плагин с обработчиком события products_collection.filter который отсеивает товары категории + хэлпер-метод для удаления хар-к категории из $filters в category,html

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите