Фильтры для магазина: mFilter2 + msProducts

Чуть более 3х дней обновлял и дописывал фильтры на MamaBoutique и остался очень доволен результатом.

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

Как обычно, нетерпиливые могут сразу понажимать рабочие ссылочки (выдача каталога и поиск), а я немного расскажу, что и как работает.

Работа с msProducts

Абсолютно все разделы с товарами выдаются через mFilter2, только раньше id для них получались самописным сниппетом и подсовывались в &resources=``, а теперь достаточно указать в шаблоне
[[!mFilter2?
	&parents=`[[*id]]`
	&element=`msProducts`
	&where=`{"class_key":"msProduct"}`
]]

Ну понятно, что товары выдаются из текущей категории, но зачем указывать &where=``? Очень просто: по умолчанию, mFilter2 никак не фильтрует id, кроме как по родителям, а msProducts показывает только товары, игнорируя остальные ресурсы.

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

Если вы планируете использовать сортировку по полям ресурса, то нужно еще указать &class=`msProduct`, это необходимо для получение правильного алиаса полей ресурса в msProducts. А для вывода картинок из галереи товаров нужно указать &includeThumbs=`158x210`.

Не забывайте, что все параметры, указанные в mFilter2 передаются в getPage, в оттуда в msProducts — поэтому можно смело указывать все их параметры. Если что то не работает — включайте лог (&showLog=`1`) и смотрите в системный журнал — там должны быть ошибки от них.

Дополнительный функционал

Какие нестандартные вещи используются в каталоге MamaBoutique?
1. Слайдер для цены
2. Обертывание больших списков в блоки с прокруткой
3. Вывод ссылки «показывать по n товаров» или «показать все n товаров», в зависимости от общего кол-ва
4. Сброс состояния фильтров — появляется ссылка при изменении
5. Вывод выбранных фильтров, с возможностью отключения

Пользуясь случаем, хочу искренне поблагодарить дизайнеров Simple Dream за все эти изыски.

Для изменения родного javascript нужно просто переименовать default.js в любое имя, указать его в системной настройке mse2_frontend_js и спокойно редактировать — он подключится на страницу автоматически и не будет затёрт при обновлении.

Собственно, я так и сделал, дописав весь необходимый функционал на javascript (а раньше пункты 3 и 5 работали на php).

Поиск

Поиском занимается всё тот же mFilter2, вызывая метод mSearch2::Search(). Единственное, с чем пришлось попотеть — это сохранение порядка выводимых ресурсов через msProducts, ведь они должны идти по релевантности.
Для этого пришлось редактировать msProducts и эти правки скоро попадут в обновление MS2.

Также отдельно написал и обработку автоподсказок, специальным php файлом. Он выбирает категории, соответствующие поисковому запросу, и считает кол-во активных товаров в них. при клике вы переходите в нужный раздел каталога, а не на поиск.

Для этого подсказок используется тот же метод, что и для основного поиска, так что релевантность в наличии.

Бренды

Отдельным пожеланием при разработке новой версии, была генерация нормальных url на результаты поиска. Ну, то есть без # в строке адреса, для сохранения статуса страницы.

Поэтому, в mFilter2 без проблем работают вот такие ссылки
http://mamaboutique.ru/search.html?resource|parent=74&ms|vendor=8&ms|price=1096,2039&query=emma

Насколько я понимаю, СЕО специалисты и поисковые машины только приветствуют этот подход. Но мы пошли еще немного дальше, и сделали выдачу товаров производителей по человекопонятным ссылкам, например
http://mamaboutique.ru/store/brands/alles/
и
http://mamaboutique.ru/store/brands/cachecoeur/

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

Товары выбираются маленьким сниппетом и скармливаются в параметр &resources.

Акции

Ну и последний раздел, где трудится наш стахановец — акции и скидки.

Здесь есть 4 страницы, у которых определен критерий выборки товаров. Новые, популярные, со скидкой и т.п. При загрузке определяется, по какому параметру фильтровать товары, отдельный сниппет выбирает их id и отдает в &resources.

Вот так и получается, в итоге, отдельная страница с новыми или популярными товарами.

Заключение

Очень, очень доволен работой mFilter2. Все навороты удалось реализовать без хаков и костылей, никаких вызовов сниппетов в чанках и прочей лабуды.

Каталог летает, фильтрация не отстаёт. Надеюсь, вам было интересно почитать, что можно сделать с магазином при использовании mFilter2.

На всякий случай напоминаю, что этот сниппет входит в комплект платного дополнения mSearch2.

В ближайшее время планирую выпустить обновления mSearch2 и miniShop2, куда войдут разные улучшения, добавленные на MamaBoutique.

Следующая заметка
[mSearch2] Версия 0.6.0 beta
Предыдущая заметка
[mFilter2] Новые динамические фильтры


Комментарии ()

  1. Виталий Князь 27 июня 2013, 11:31 # 0
    на mamaboutique.ru 5-ый пункт из доп. функционала — при клике на удалении параметра фильтра все разве должны сбрасываться?
    у меня сбрасываются все (Google Chrome).
    1. Василий Наумкин 27 июня 2013, 11:54 # 0
      Спасибо, поправил!

      Вот для этого и нужно показывать свою работу — обязательно укажут на ошибки =)
    2. Ilya Ershov 27 июня 2013, 14:51 # 0
      Василий, хотел бы с Вами посоветоваться.

      У меня сейчас стоит задача сделать сайт-интернет-магазин. До этого делал магазины на ShopKeeper'е. Этот новый проект хочу сделать на Вашем MS2.

      Особенность проекта в том что, магазин возможно будет в поддомене основного сайта (или дополнительным контекстом), который сделан на MODx и ориентирован на b2b по всему миру, 8 контекстов под 8 языков. На основном сайте в русской версии есть каталог товаров (без цен, так как цены не фиксированные).

      Интернет магазин в поддомене будет ориентирован только на СПб и Лен. Область, с конкретными ценами и т.д. И из соображений SEO есть пожелание не дублировать каталог с основного сайта.

      Вопрос: возможно ли используя miniShop2 реализовать функционал интернет-магазина (добавление товаров в корзину) из каталога представленного на основном сайте (с помощью сессий или куки). Просто у компании уже есть 3 сайта, на которых по сути представленны одни и те же товары…

      Можете что-то порекомендовать? Или не стоит разводить «геморрой» и делать ещё один обычный магазин дублируя содержимое каталога товаров?

      P.S. Извиняюсь, если получился вопиющий оффтоп
      1. Василий Наумкин 27 июня 2013, 15:06 # 0
        Если это будет на одном сайте, разными контекстами — то нет проблем.

        В корзину добавляются id товаров, процессом можно полностью управлять, за счет 4х расширяемых классов: корзина, доставка, заказ и оплата. Если разобраться, то на MS2 можно написать вообще, что угодно, при условии знания php, конечно.

        Как пример — наш магазин, который торгует цифровыми товарами и при оплате открывает их для закачки в репозитории. Там и корзина своя, и заказ.
        1. Ilya Ershov 27 июня 2013, 15:10 # 0
          Ок. Спасибо за ответ! Мне было главным верно выбрать направление движения в начале работы.

          P.S. Без знания php, мне кажется, я бы и подумать не мог, чтобы такой вопрос задать ;)
      2. Смирнов Николай 28 июня 2013, 02:28 # 0
        Не здоровый косяк с роутером на OnPageNotFound
        mamaboutique.ru/store/kjh/kj/brands/cachecoeur/
        mamaboutique.ru/store/bla/bla/brands/cachecoeur/
        mamaboutique.ru/blabla/brands/cachecoeur/
        mamaboutique.ru/st/brandsa/cachecoeur/

        Т.е. вы проверяете только последнюю секцию URL'a а нужно все секции учитывать! Обратите внимание на то как реализованы роутеры в популярных фреймворках
        1. Василий Наумкин 28 июня 2013, 06:09 # 0
          А зачем мне рассчитывать на то, что кто-то будет руками всякую фигню писать?

          Таких ссылок на сайте нет.
          1. Смирнов Николай 28 июня 2013, 11:34 # 0
            А зачем мне рассчитывать на то, что кто-то будет руками всякую фигню писать?
            И всё же вы исправили…
            1. Василий Наумкин 28 июня 2013, 11:35 # 0
              Надо же тебя порадовать……………
              1. Смирнов Николай 30 июня 2013, 00:33 # 0
                Безусловно я рад что вы не оставили без внимания моё замечание, значит не зря писал коммент.
                Но ведь в конечном счете вы же увеличили качество продукта для конечного заказчика. А значит я здесь не причем)
        2. Музалевский Виктор 10 июля 2013, 13:38 # 0
          Попробовал сделать связку mFilter2 + msProducts. В настройках категории товара указал следующее.
          [[!mFilter2?
          &parents=`[[*id]]`
          &element=`msProducts`
          &where=`{«class_key»:«msProduct»}`
          ]]
          Все бы хорошо но фильтр не фильтрует а только вывод под категории с предварительным результатом. отмечаем галкой одну из под категорий и ничего не происходит.
          1. Володя 10 июля 2013, 14:01 # 0
            а фильтры указать вы не забыли? &filters=`
            1. Василий Наумкин 10 июля 2013, 14:16 # 0
              Скорее всего, ты не обратил внимания на id элементов в дефолтных чанках — их нужно сохранять.

              В любом случае, всем покупателям бесплатная техподдержка, так что просто задай вопрос в магазине и мы тебе поможем.
            Добавление новых комментариев отключено.