[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
10
2 972
+2

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

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

    А они будут работать как «И» или «ИЛИ»?
      Василий Наумкин
      24 декабря 2014, 19:11
      0
      Как обычные независимые фильтры.
        Mihan
        26 декабря 2014, 00:15
        0
        Здорово. А разделитель в этом поле какой? Точка-запятая?
          Василий Наумкин
          26 декабря 2014, 05:16
          0
          Теперь вы можете просто обновить mSearch2 и писать в полях опций товаров miniShop2 строки через разделитель в формате «ключ==значение»
      Іван Клімчук
      10 февраля 2015, 17:28
      0
      После последних изменений в msearch2 и minishop у всех этот механизм адекватно работает? У меня перестали генерироваться опции и фильтры не работают по тегам вида key==value
        Василий Наумкин
        10 февраля 2015, 19:26
        0
        Да, вот этот коммит сломал функционал.

        А вот этот должен починить. Пробуй обновиться.
          Іван Клімчук
          11 февраля 2015, 00:06
          0
          Спасибо! Вроде помогло, правда в одном разделе все равно какая-то мистика осталась, в файле импорта свойств больше, а показывает всего 2 и в них не все возможные параметры. Но видимо уже в другом причина
        Николай
        16 марта 2015, 09:55
        0
        А можно ли использовать это без 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
          0
          отличная работа!

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

            А данное изменение позволяет добавлять из этих методов вообще новые фильтры, не указанные в параметре &filters.
              Ilya Z.
              05 апреля 2015, 16:58
              0
              а если я хочу использовать тот же, что и для 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
                0
                Если переписать генерацию фильтров.

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

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