Выбор нескольких значений одной характеристики в динамических категориях.

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

Пробую писать плагин, если захардкодить все получается, но хотелось бы иметь возможность обновляться, пишу плагин.
Ввод сделал, теперь в базе данных по сабмиту формирую запись со значением вида cpu.value_id IN(8,9)&brand.value_id IN(69) в стандартном случае формировались параметры только с одним значением типа brand.value_id (69) , далее насколько я понял эта запись обрабатывается в shopProductsCollection который парсит это значение но ставит везде между параметрами логическое И, то есть, чтобы обработать несколько значений я пишу свой обработчик IN и добавляю в класс (если хардкодить). Вопрос как вынести этот обработчик в плагин. Прошу откликнуться разработчиков вебассист (техподдержка попросила указать теги webasyst для привлечения внимания разработчиков). Заранее спасибо.

8 ответов

  • 2
    Алексей Webasyst 8 декабря 2015 07:16 #

    Для цветов можете например использовать https://www.webasyst.ru/store/plugin/shop/col/

    • +1
      Maxim Rondin Maxim Rondin 8 декабря 2015 09:33 #

      Да, спасибо, но там не только цвета, хотелось бы все таки получить раширение фильтров динамической категории. Так получается класс shopProductsCollection нельзя расширить в плагине ? или я как то неясно спрашиваю ?

      • +2
        Александр Александр 9 декабря 2015 06:41 #

        Что бы расширить класс, нужно его наследовать. Следовательно в своем плагине создайте класс, например shopMyProductsCollection c содержимым:

        <?php
        
        class shopMyProductsCollection extends shopProductsCollection
        {
        
        }

        И добавьте туда нужные вам методы. Далее в коде плагина используйте вами созданный класс.


        • +1
          Maxim Rondin Maxim Rondin 9 декабря 2015 07:06 #

          Спасибо, да это понятно, о дело в том, что я этот класс в плагине не использую, его используют уже функции дывижка для вывода категории в админке и на фронте. Чтобы было понятней, что я делаю вот код в shopProductsCollection.class.php:
          стандартный

          $part = str_replace(array($escapedBS, $escapedAmp), array('\\\\', '\\&'), $part);

          if ($temp = preg_split("/(\\\$=|\^=|\*=|==|!=|>=|<=|=|>|<)/uis", $part, 2, PREG_SPLIT_DELIM_CAPTURE)) {

          $name = trim(array_shift($temp));

          if ($name == 'tag') {

          $temp[1] = explode('||', $temp[1]);

          }

          if ($name != 'price') {

          $result[$name] = $temp;

          } else {

          if ($temp[0] == '>=') {

          $result[$name][0] = $temp;

          } else if ($temp[0] == '<=') {

          $result[$name][1] = $temp;

          } else {

          $result[$name] = $temp;

          }

          }

          }

          который мне нужен

          $part = str_replace(array($escapedBS, $escapedAmp), array('\\\\', '\\&'), $part);

          if ($temp = preg_split("/(\\\$=|\^=|\*=|==|!=|IN|>=|<=|=|>|<)/uis", $part, 2, PREG_SPLIT_DELIM_CAPTURE)) {

          $name = trim(array_shift($temp));

          if ($name == 'tag') {

          $temp[1] = explode('||', $temp[1]);

          }

          if($temp[0] == 'IN') {

          $temp[1] = explode(',', str_replace(array('(',')'), '',$temp[1]));

          }

          if ($name != 'price') {

          $result[$name] = $temp;

          } else {

          if ($temp[0] == '>=') {

          $result[$name][0] = $temp;

          } else if ($temp[0] == '<=') {

          $result[$name][1] = $temp;

          } else {

          $result[$name] = $temp;

          }

          }

          }



          • +1
            Maxim Rondin Maxim Rondin 10 декабря 2015 02:45 #

            То есть я добавляю shopProductsCollection.class.php:

            if($temp[0] == 'IN') {

            $temp[1] = explode(',', str_replace(array('(',')'), '',$temp[1]));

            }
            А затем уже этот класс вызывается методами вебасиста.
            Как это вынести в плагин, чобы при обновлениях не слетало это все.

            • +2
              Александр Александр 10 декабря 2015 03:09 #

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

              • +1
                Maxim Rondin Maxim Rondin 10 декабря 2015 03:51 #

                Спасибо, а подменить весь класс также нельзя ? Может какой то запрос разработчикам ну хук в этом месте можно отправить ? Я посмотрел по форуму, запросов на расширение этих фильтров достаточно много.

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

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