[mSearch2] 1.2.0-rc Самостоятельная генерация фильтров

На днях в поддержке mSearch2 был задан вопрос:
Мне необходимо сделать на сайте фильтры по очень большому количеству параметров. Причем, наборы этих параметров отличаются в зависимости от категории.

Планируется что информация о товарах будет постоянно автоматом импортироваться через API этого поставщика на сайт который я делаю.
С другой стороны, волосы встают дыбом при мысли о ручной настройке такого количества дополнительных полей miniShop2 через механизм плагинов или TV.

Поэтому, пришла такая идея:
Все названия доп.параметров записывать в поле Теги, которое уже реализовано в miniShop2. Например, товару можно записать два таких тега: «Максимальное разрешение видеозаписи|2304x1296» и «Тип видеорегистратора|Стандартный».

Теперь осталось только придумать как сгруппировать эти тэги по первому полю (до разделителя "|") и создать из каждой группы отдельный фильтр.

То есть, речь идёт о бесконечном количестве свойств у товара, добавляемых в одно текстовое поле, и построении для них фильтров.

Вроде бы, продвинутые возможности расширения класса mFilter2 должны бы с этим справиться? Как оказалось — нет.

В данном случае нам нужно создавать новые фильтры на лету, как если бы их указали в параметре &filters=``. То есть, нам нужны совсем «виртуальные» поля, которых вообще нет, но для них как бы строятся фильтры.

Сделать это штатными средствами у меня не удалось, и тогда я немного изменил код mSearch2 так, чтобы реализовать возможность добавления фильтров, не указанных в &filters=``, из build методов, и не сломать при этом совместимость со старыми версиями.

Теперь вы можете просто обновить mSearch2 и писать в полях опций товаров miniShop2 строки через разделитель в формате «ключ==значение»:


И на выходе получите автоматически сгенерированные фильтры:


Остаётся только добавить нужные записи в системные словари и дело в шляпе! Как мне кажется, возможности для заведений свойств товара теперь открываются просто безграничные.

Значения без разделителей работают как обычно и не выносятся в отдельные фильтры. То есть, имеющиеся теги будут работать как и раньше.

Напоминаю, что до нового года в магазине Simple Dream скидки и mSearch2 можно купить всего 1492.5 руб.
Василий Наумкин
Василий Наумкин
24 декабря 2014, 09:45
modx.pro
3 634

Комментарии: 14

Володя
24 декабря 2014, 14:24
Делал тоже самое не так давно, только без лексиконов. Мне показалось так удобнее когда свойства постоянно импортируются вместе с товаром.
То есть первая часть свойства и есть заголовок.
    Mihan
    24 декабря 2014, 18:54
    Как долго я об этом мечтал.

    А они будут работать как «И» или «ИЛИ»?
      Василий Наумкин
      24 декабря 2014, 19:11
      Как обычные независимые фильтры.
        Mihan
        26 декабря 2014, 00:15
        Здорово. А разделитель в этом поле какой? Точка-запятая?
          Василий Наумкин
          26 декабря 2014, 05:16
          Теперь вы можете просто обновить mSearch2 и писать в полях опций товаров miniShop2 строки через разделитель в формате «ключ==значение»
      Іван Клімчук
      10 февраля 2015, 17:28
      После последних изменений в msearch2 и minishop у всех этот механизм адекватно работает? У меня перестали генерироваться опции и фильтры не работают по тегам вида key==value
      Николай
      16 марта 2015, 09:55
      А можно ли использовать это без ms2? Могу ли я создать обычное доп поле, и писать туда json вида [«tag1==12»,«tag2==34»], а потом на странице вызывать
      [[!mFilter2? &parents=`30` &tpls=`tpl.teamplates.new` &includeTVs=`img` &filters=`tv|flt`]]
      Я сейчас попробовал, не получилось,
      <label for="mse2_tv|flt_0" class="">
      	<div id="mse2_tv|flt_0-styler" class="jq-checkbox" unselectable="on" style="-webkit-user-select: none; display: inline-block; position: relative; overflow: hidden;"><input type="checkbox" name="tv|flt" id="mse2_tv|flt_0" value="[" tag1="=12","tag2==34"]"" style="position: absolute; z-index: -1; opacity: 0; margin: 0px; padding: 0px;"><div class="jq-checkbox__div"></div></div> ["tag1==12","tag2==34"] <sup>1</sup>
      </label>
      Выдало…
        Ilya Z.
        01 апреля 2015, 16:08
        отличная работа!

        я так понимаю, что фильтр, как для цены таким образом создать нельзя?
          Василий Наумкин
          01 апреля 2015, 16:50
          Можно создать любой фильтр, если написать свои методы.

          А данное изменение позволяет добавлять из этих методов вообще новые фильтры, не указанные в параметре &filters.
            Ilya Z.
            05 апреля 2015, 16:58
            а если я хочу использовать тот же, что и для price.

            для самого свойства price понятно, пишем:
            &filters=`ms|price:number`
            &tplFilter.outer.ms|price=`tpl.mFilter2.filter.slider`
            &tplFilter.row.ms|price=`tpl.mFilter2.filter.number`
            а как быть, если я добавил:
            &filters=`ms|price:number,msoption|tags`
            а в tags товаров пишу res==1, для другого товара res==5 и т.д.

            сейчас поля res у меня выводятся, как чекбоксы в фильтре. а есть ли возможность применить для res метод number и tpl'ы такие же, как и для price?
              Василий Наумкин
              05 апреля 2015, 19:28
              Если переписать генерацию фильтров.

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

              Поэтому придётся делать свой кастомный класс фильтрации и там колдовать.
          Валерий
          05 мая 2019, 23:22
          msoption|tags — очень круто!
          Подскажите, пожалуйста, как можно вывести только популярные фильтры тегов?
          Например, где количество значений больше числа N или варианты ответа выдадут большой результат.
          Буду рад если подскажете куда копать. Спасибо!
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            14