Компонент поиска и фильтрации mSearch2

На прошлом занятии мы рассмотрели простой вывод каталога товаров сниппетами miniShop2. Как мы помним, товары — это расширенные ресурсы MODX, а значит, с ними можно работать и другим сниппетам.

Сегодня мы познакомимся с платным дополнение для MODX, которое осуществляет поиск и фильтрацию любых ресурсов — mSearch2.

Основные особенности:
  • Морфологический поиск сразу на нескольких языках. По умолчанию — русский и английский.
  • Обновление поискового индекса автоматически, при сохранении ресурса в админке.
  • Возможность задать «поисковый вес» каждому индексируемому полю ресурса.
  • Возможность индексации ТВ параметров и комментариев Tickets.
  • Поиск по ресурсам внутри админки сайта.
  • Сохранение поисковых запросов и управление синонимами слов.
  • Автоподсказки и быстрый поиск.
  • Ajax фильтрация результатов поиска с построением прямых url через History Api.
  • Возможность расширения класса фильтрации для прописывания собственной логики.
  • Гибкая работа с шаблонами оформления — для каждого фильтра есть возможность назначить собственные.
  • Высокая скорость работы и поиска, и фильтра.
  • Возможность выводить результаты поиска и фильтрации любыми сниппетами.


Установка

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

Затем, в админке, вы можете загрузить еще дополнительные словари:

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

После этого вы уже можете что-то искать в админке.

Обратите внимание, что поиск — морфологический. Например, по запросу «товары» mSearch2 находит рсеурсы с названием «Товар», а вот встроенный поиск MODX 2.3 — нет. Он ищет точное совпадение.

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

Вывод на сайте

Есть два способа вывода поиска на сайте: простой и с фильтрацией.

Простой способ — это вывод формы поиска, и результатов с постраничной разбивкой под ней.
[[!mSearchForm?
	&autocomplete=`results`
]]

[[!pdoPage?
	&element=`mSearch2`
]]

[[!+page.nav]]

Автоподсказки выводятся сразу по результатам запроса. То есть, это даже не подсказки, а быстрый поиск — если кликнуть на результат, то вы сразу перейдёте на страницу ресурса — minishop2.com/search/simple.


Более продвинутый вывод поиска, с фильтрацией:
[[!mSearchForm?
	&autocomplete=`queries`
]]

[[!mFilter2?
	&forceSearch=`1`
]]

Параметр &forceSearch=`1` указывает фильтру, что не нужно сразу выводить ресурсы для фильтрации — должен быть поисковый запрос. Также здесь уже включен режим автоподсказок по истории запросов.

Как видите, использовать mSearch2 очень просто — minishop2.com/search/filter.

Вывод каталога товаров miniShop2

В отличии от других подобных решений фильтрации, mFilter2 строит фильтры динамически, в зависимости от выводимых ресурсов. А это значит, чтобы мы можем использовать msProducts для вывода товаров.
[[!mFilter2?
	&parents=`0`
	&limit=`10`
	&element=`msProducts`
	&filters=`
		ms|price:number
		,parent:categories
		,msoption|tags
		,ms|vendor:vendors
	`
	&class=`msProduct`
	&tplFilter.outer.ms|price=`tpl.mFilter2.filter.slider`
	&tplFilter.row.ms|price=`tpl.mFilter2.filter.number`
]]
Всё оформление блока вывод находится в чанке tpl.mFilter2.outer, также мы указываем специальные числовые чанки для вывода слайдера с ценой.

Пожалуй, это самый крутой способ выводить товары сайта — minishop2.com/catalog/.

Заключение

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

Например, вы можете добавить товару новое поле через плагины miniShop2 и настроить фильтрацию по нему — вот готовая инструкция.
Вообще, рекомендую внимательно почитать документацию на сайте docs.modx.pro/components/msearch2/, там всё очень подробно расписано.

Самостоятельно пробовать платные дополнения перед покупкой можно на test.modx.pro.

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

Следующая заметка
Личный кабинет покупателя Office
Предыдущая заметка
Вывод каталога товаров и оформление заказа


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

  1. Саша Туманов 14 августа 2014, 21:32 # 0
    Очень беспокоит один вопрос, на который не нашел ответа в магазине симплдрим.
    Хочу купить, для начала, mSearch2 и в связи с этим хотелось бы понимать, что покупаю. В том смысле, как я могу дальше использовать этот код? Только в одном или во всех своих проектах? Могу ли я брать деньги за настроенные мной сайты с установленным купленным кодом? Как обстоят дела с обновлением? Появляется ли у меня приоритет в тех. поддержке?
    Если где то есть доступное описание этих моментов, пожалуйста дай ссылочку! Я бегло прочитал «Положения» в магазине, но это, кажется, не то.
    1. Василий Наумкин 14 августа 2014, 21:48 # 0
      В том смысле, как я могу дальше использовать этот код?
      Как угодно.

      Только в одном или во всех своих проектах?
      Дополнение покупается для ключа репозитория. Один сайт — один ключ. Для нового сайта нужно покупать еще раз, за кажду покупку + 10% скидка и так до 50%.

      Могу ли я брать деньги за настроенные мной сайты с установленным купленным кодом?
      Естественно.

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

      Появляется ли у меня приоритет в тех. поддержке?
      Да, появляется возможность задавать вопросы в поддержке магазина.
      1. Саша Туманов 14 августа 2014, 21:56 # 0
        Полная ясность. Спасибо за оперативность :)
        1. Комментарий был удален.
          1. Комментарий был удален.
            1. Комментарий был удален.
              1. Комментарий был удален.
                1. Комментарий был удален.
                  1. Комментарий был удален.
                    1. Комментарий был удален.
                      1. Комментарий был удален.
                        1. Комментарий был удален.
                          1. Комментарий был удален.
          2. Саша Туманов 16 августа 2014, 00:35 # 0
            Василий, а можно каким то образом вызывать блок фильтров и вывод результатов в разных местах шаблона?
            А то у меня по дизайну слева в сайдбаре сначала менюшка с категориями товаров, ниже под ней блок фильтров, еще ниже, может еще, что то будет.
            А справа в контентной области, сначала слайдер, а под ним уже каталог, который, собственно, результаты и есть.
            1. Василий Наумкин 16 августа 2014, 05:16 # 0
              &toPlaceholders
              Если не пусто, mFilter2 сохранит все данные в плейсхолдеры: [[+filters]], [[+results]] и [[+total]] с префиксом, указанным в этом параметре. Например, если вы указжете &toPlaceholders=`my.`, то получите: [[+my.filters]], [[+my.results]] и [[+my.total]]
              docs.modx.pro/components/msearch2/snippets/mfilter2
              1. Саша Туманов 16 августа 2014, 12:25 # 0
                То есть при таком вызове
                			[[!mFilter2?
                				&limit=`10`
                				&element=`msProducts`
                				&fastMode=`0`
                				&filters=`
                					parent:categories
                					,msoption|color
                					,msoption|size
                				`
                				&toPlaceholders=`cat`
                			]]
                			[[+cat.filters]]
                
                В [[+cat.filters]] должно, что то выводиться (там пусто), я правильно понял?
                1. Василий Наумкин 16 августа 2014, 13:34 # 0
                  Точку после cat забыл.
                  1. Саша Туманов 16 августа 2014, 13:39 # 0
                    Уххххххх…
                    Центнер кирпичей уже произвел.
                    Спасибо! )
            2. Саша Туманов 16 августа 2014, 19:49 # 0
              Все замечательно сверсталось и настроилось, спасибо! ) Пара вопросов появилась в процессе.
              Если хотя бы раз использовать фильтр, то даже если все галки потом убрать, то исчезает пагинация от pdoPage. Как бы, вот её обратно?
              Вызов такой
              [[!mFilter2?
                  &class=`msProduct`
                  &element=`msProducts`
                  &parents=`[[*id]]`
                  &suggestions=`0`
                  &sort=`product|pagetitle:asc`
                  &tplFilter.outer.default=`tpl.my.filter.outer`
              	&filters=`
              		parent:categories
              		,msoption|color
              		,msoption|size
              		,ms|density
              	`
              	&tplFilter.row.ms|density=`tpl.my.filter.row.density`
              	&toPlaceholders=`my.`
              	&limit=`6`
              	&tplPageWrapper=`@INLINE <div id="pagination">[[+first]][[+prev]][[+pages]][[+next]][[+last]]</div>`
              	&tplPage=`@INLINE <a href="[[+href]]">[[+pageNo]]</a> `
              	&tplPageActive=`@INLINE <a class="active" href="[[+href]]">[[+pageNo]]</a> `
              	&tplPageFirst=`@INLINE  `
              	&tplPageLast=`@INLINE   `
              	&tplPagePrev=`@INLINE <a href="[[+href]]" id="prev">«</a> `
              	&tplPageNext=`@INLINE <a href="[[+href]]" id="next">»</a> `
              	&tplPageSkip=`@INLINE <span>...</span> `
              	&tplPageFirstEmpty=`@INLINE  `
              	&tplPageLastEmpty=`@INLINE   `
              	&tplPagePrevEmpty=`@INLINE <span id="prev">«</span> `
              	&tplPageNextEmpty=`@INLINE <span id="next">»</span> `
              ]]
              
              И еще, у меня блоки с фильтрами в сайдбаре, сделаны скрывающимися. Вот можно где то хранить их состояние?
              Ну, в смысле, я могу сам их в куку сложить, но ведь состояния чекбоксов где то хранятся? Может и состояние блоков туда же? Есть для этого какой то простой способ?
              1. Василий Наумкин 16 августа 2014, 20:13 # 0
                Пагинация должна быть в блоке mse2_pagination, а у тебя просто pagination — вот скрипт её и не вставляет на страницу.

                Состояние чекбоксов хранится в url, чтобы можно было давать прямые ссылки на результаты фильтрации. Состояние элементов оформления лучше хранить в куках юзера.
                1. Саша Туманов 16 августа 2014, 20:22 # 0
                  Василий, ты потрясающе понятный человек. Спасибо :)
                  1. Василий Наумкин 16 августа 2014, 20:48 # 0
                    На здоровье!
              2. Саша Туманов 23 августа 2014, 16:13 # 0
                Василий привет!
                Обнаружилась такая ситуация. Для доступа к сайту есть два домена, на латинице и на кириллице, один ссылка на другой. И вот, когда попадаешь на страничку с каталогом с латинского домена (по сохраненной ссылке, например) и используешь на ней фильтр, то js ругается на невозможность передавать данные на другой домен и не работает. Ошибку показывает в 606-й строке default.js
                602		if (!this.oldbrowser()) {
                603			if (hash.length != 0) {
                604				hash = '?' + hash.substr(1);
                605			}
                606			window.history.pushState(hash, '', document.location.pathname + hash);
                607		}
                
                Кириллический домен кодируется в punycode
                1. Андрей 02 сентября 2014, 13:31 # 0
                  Доброго времени суток уважаемый Василий. Прошу написать мне пару строчек ясности, если это не совсем затруднидь вас.
                  Если не ставить mimishop2 на сайт, будет ли работать mFilter2, если да, то как он будет подтягивать изображения с ресурсов?

                  У меня есть на сайте структурированный каталог, в каждом ресурсе есть TV поля для фильтрации + картинки. Реально ли выводить фильтром эти данные, или же необходимо грузить mimishop2.
                  1. Василий Наумкин 02 сентября 2014, 14:10 # 0
                    Если не ставить mimishop2 на сайт
                    Для того, чтобы установить mimishop2 на сайт, его нужно сначала написать. Потому что есть miniShop2, а mimishop2 нет.

                    как он будет подтягивать изображения с ресурсов?
                    Он и не будет — это будет делать сниппет, используемый для вывода результатов: хоть pdoResources, хоть getResources.

                    Реально ли выводить фильтром эти данные
                    Конечно. Можно попробовать дополнение в работе на test.modx.pro перед покупкой.
                  2. Андрей 12 сентября 2014, 10:58 # 0
                    Где можно посмотреть, как настраивать TV параметры в ресурсах, чтобы потом их вывести с помощью фильтров?
                    У меня есть к примеру n-количество ресурсов с тремя TV
                    1. Марка
                    2. Тип кузова
                    3. Грузоподъемность (данные в числах, чтобы потом слайдером выводить)
                    В каком виде мне сделать запрос, чтобы вывелись эти поля для сортировки с помощью фильтра? Подскажите плиз.

                    Правильно ли я заполняю TV параметры? Или их нужно заполнять в самом TV а потом в ресурсе просто из возможных вариантов выбирать???
                    1. Василий Наумкин 12 сентября 2014, 11:58 # 0
                      [[!mFilter2?
                      	&parents=`0`
                      	&filters=`
                      		tv|marka,
                      		tv|type_kuzov,
                      		tv|type_bus,
                      		tv|cargo,
                      		tv|for_what
                      	`
                      ]]
                      docs.modx.pro/components/msearch2/snippets/mfilter2
                      1. Андрей 12 сентября 2014, 14:01 # 0
                        Спасибо, помогло! ))
                        Только вот все выводится по английски: сортировка, лексиконы и т.д. Это из за того, что стоит включены два словаря английский и русский?! Мне надо они оба для поиска… Как по умолчанию сделать лексиконы русскими?
                        1. Василий Наумкин 12 сентября 2014, 14:28 # 0
                          Прочитай, пожалуйста, что написано по ссылке, в самом конце.
                          1. Андрей 12 сентября 2014, 16:21 # 0
                            А где указывается то, что выводится в [[+results]] ???
                            У меня абракадабра выводится, единственным хорошим есть ссылка, которая реально ведет на нужную страницу.

                            Хочу сделать так, чтобы выводилась картинка и ссылка.
                            Вот
                            1. Василий Наумкин 12 сентября 2014, 16:27 # 0
                              &element — Сниппет, который будет вызываться для вывода результатов работы, по умолчанию — mSearch2.
                              docs.modx.pro/components/msearch2/snippets/mfilter2

                              Хочу сделать так, чтобы выводилась картинка и ссылка.
                              Укажи параметры для этого сниппета при вызове mFilter2 — они туда передадутся.
                    2. Андрей 13 сентября 2014, 12:25 # 0
                      Большое спасибо за качественную и реально полезную консультацию по MODX.
                      Василий Наумкин — The Best!
                      1. Василий Наумкин 13 сентября 2014, 13:15 # 0
                        На здоровье!
                      2. Mihan 13 сентября 2014, 18:44 # 0
                        Василий, подскажи, пожалуйста.
                        Разделил вывод и фильтр с помощью toPlaceholder. Все замечательно выводится. Но вот фильтры не работают. Что я не так делаю?
                        1. Василий Наумкин 13 сентября 2014, 18:45 # 0
                          Для правильной работы необходимо, чтобы все элементы фильтра располагались в одном блоке с #mse2_mfilter. Именно так прописано с стандартном чанке tpl.mFilter2.outer.
                          1. Mihan 14 сентября 2014, 15:22 # 0
                            Разместил все под один контейнер. Изменений нет.

                            file.modx.pro/files/e/b/7/eb7fd42f4fd7defdfc0d94ed728c71fa.png
                            1. Василий Наумкин 14 сентября 2014, 17:12 # 0
                              Даже на картинке видно, что вывод результатов не попадает в этот блок.
                              1. Mihan 16 сентября 2014, 14:11 # 0
                                Ну как не попадает? ColumnLeft — фильтр, ColumnRight — результат, оба блока в .

                                Так же как на minishop2.com и mamaboutique take.ms/OkrkG
                                1. Mihan 17 сентября 2014, 14:39 # 0
                                  Василий, все же прошу помочь с этим вопросом. 3 дня ломаю голову, весь твой FAQ по компоненту прочел.
                                  Честно говоря, думал, что в этом курсе будут рассмотрены эти аспекты. А инфы меньше, чем в FAQе приложения.
                                  1. Василий Наумкин 17 сентября 2014, 15:06 # 0
                                    По картинкам плохо угадывается — я обратил снимание, что подсвечивается только блок фильтров, а на код не посмотрел.

                                    Ты купил дополнение? Создай тикет, напиши там доступы к сайту, я зайду и посмотрю, что не так.

                                    Сколько бы я не написал информации, всегда есть у кого не работает и ничего здесь не поделать.
                          2. Андрей 17 сентября 2014, 11:20 # 0
                            Здравствуйте уважаемый.
                            У меня на странице подбора шасси все настроено благодаря Вам и работает:
                            [[!mFilter2?
                            &element=`pdoResources`
                            &tpl=`tpl.Product.row`
                            &tvPrefix=``
                            &parents=`12`
                            &hideContainers=`1`
                            &includeTVs=`imgtovara`
                            &filters=`
                            tv|cargo:number,
                            tv|marka
                            `
                            &tplFilter.outer.tv|cargo=`tpl.mFilter2.filter.slider`
                            &tplFilter.row.tv|cargo=`tpl.mFilter2.filter.number`

                            ]]

                            А вот на странице подбора автобуса не выводится слайдер, в чем я ошибся?
                            [[!mFilter2?
                            &element=`pdoResources`
                            &tpl=`tpl.Product.row`
                            &tvPrefix=``
                            &parents=`5`
                            &hideContainers=`1`
                            &includeTVs=`imgtovara`
                            &filters=`
                            tv|place:number,
                            tv|marka,
                            tv|tipavtobusa
                            `
                            &tplFilter.outer.tv|placeBus=`tpl.mFilter2.filter.slider`
                            &tplFilter.row.tv|placeBus=`tpl.mFilter2.filter.number`
                            ]]

                            это вопрос номер один. Вторая проблема, в УПРАВЛЕНИИ СЛОВАРЯМИ не нахожу новый фильтр для смены имени, смотрел в обоих языках ru и en.
                            ПОМОГИТЕ плиз.
                            1. Василий Наумкин 17 сентября 2014, 11:44 # 0
                              В первом случае:
                              tv|cargo:number,

                              &tplFilter.outer.tv|cargo
                              Во втором:
                              tv|place:number,

                              &tplFilter.outer.tv|placeBus
                              Неужели так трудно внимательно сверить два вызова дополнения и найти отличия, почему в одном случае работает, а в другом нет?

                              не нахожу новый фильтр для смены имени
                              Ну не смешно уже.

                              Я же отправлял тебя в документацию, просил прочитать внимательно, что написано в конце. Ну как так можно то?
                              Для оформления фильтров используются записи из лексикона. Если вы добавили новый фильтр и он отображается непонятной длинной надписью на английском — это значит, что её нужно добавить в словарь mSearch2.
                              Там даже картинка есть, как добавлять записи.

                              Больше я на такие вопросы отвечать не буду, имей совесть.
                              1. Андрей 17 сентября 2014, 11:59 # 0
                                Сори. Я просто тормоз!!! Не зря говорят, 7 раз отмерь и раз отрежь. Надо быть повнимательнее
                                1. Василий Наумкин 17 сентября 2014, 12:02 # 0
                                  Значит, нет значений для вывода фильтра.

                                  То есть, ТВ параметр place у всех выводимых товаров пуст.
                                  1. Андрей 17 сентября 2014, 12:05 # 0
                                    Та нет, там все заполнено, просто я попрошу, чтобы мне очки купили. Не внимателен больно. TV был с приставкой s, ТО ЕСТЬ places
                            2. Андрей 29 сентября 2014, 17:58 # 0
                              По какой причине может перестать работать фильтрация, если учитывать, что я ничего на сайте не делал связанного с ней. Фильтры выводятся, а аякс не работает и пропал ползунок слайдер.
                              Все подключения скриптов рабочие и ведут куда надо… Помогите понять причину…
                              вот здесь беда
                              1. Василий Наумкин 29 сентября 2014, 18:03 # 0
                                Значит, делал что-то, не связанное с ней.

                                В консоли ошибка javascript.
                                1. Андрей 29 сентября 2014, 18:07 # 0
                                  А как ее исправить?
                                  1. Василий Наумкин 29 сентября 2014, 18:14 # 0
                                    Попробуй подумать, что ты там сделал, что фильтрация перестала работать? Не сама же она взяла и сломалась?

                                    А если сама — то пора вызывать охотников за приведениями.
                                    1. Андрей 29 сентября 2014, 18:25 # 0
                                      все, меня повесят на суку… Колупался с галереей, может она чего. Ладно пойду бэкап подымать
                                      1. Василий Наумкин 29 сентября 2014, 18:53 # 0
                                        Без бэкапа никак, да.
                                        1. Андрей 30 сентября 2014, 09:58 # 0
                                          Я не знаю как оценить ваше последнее сообщение?
                                          Если здесь сарказм, то да я ХЗ как его решить ту гребанную проблему. А если в самом деле без бэкапа никак, тогда я так и сделаю.
                                          1. Василий Наумкин 30 сентября 2014, 10:16 # 0
                                            Нет, не сарказм, без бэкапов действительно никуда.

                                            Все мои дополнения потому и хранятся в GitHub, что можно отмотать историю изменений и понять, что и почему сломалось.

                                            Просто хотел морально поддержать, больше не буду, извини.
                                            1. Андрей 30 сентября 2014, 10:19 # 0
                                              Вчера сделал бэкап но ничего не поменялось. Я уже в панике. Не знаю что и думать. Наверное закажу недели две назад бэкап. А иначе выбора нет!
                                              P.S. За поддержку спасибо )
                                2. Василий Наумкин 30 сентября 2014, 10:26 # 0
                                  У тебя в коде страницы вот что
                                  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
                                  <script type="text/javascript" src="/assets/js/jquery.min-1.js"></script>
                                  Сначала подключается jQuery 1.9, а сразу после этого его заменяет jQuery 1.5, в котором нет метода on() и отсюда ошибка при его использовании в mSearch2.

                                  Убирай нафиг подключение этого древнего jQuery 1.5!
                                  1. Андрей 30 сентября 2014, 10:36 # 0
                                    БОЛЬШОЕ ВАМ СПАСИБО!!!
                                    Я сразу и не понял, что в этом куске кода подключение идет [[*showAd:is=`1`:then=`[[$adLinks]]`]]
                                3. Андрей 13 октября 2014, 12:48 # 0
                                  Прошу прощения за такой вопрос, но я не смог найти где править цвет ползунка slider хочу вместо голубого сделать красным. Сами якоря, которые тягать я нашел — это картинки, а вот полоску не могу поменять цвет…
                                  Подскажите где изменить.
                                  Добавление новых комментариев отключено.