Компонент поиска и фильтрации 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]]

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

Более продвинутый вывод поиска, с фильтрацией:

[[!mSearchForm?
    &autocomplete=`queries`
]]

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

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

Как видите, использовать mSearch2 очень просто - http://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, также мы указываем специальные числовые чанки для вывода слайдера с ценой.

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

Заключение

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

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

Вообще, рекомендую внимательно почитать документацию на сайте http://docs.modx.pro/components/msearch2/, там всё очень подробно расписано.

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

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

← Предыдущая заметка
Вывод каталога товаров и оформление заказа
Следующая заметка →
Личный кабинет покупателя Office
Комментарии (47)
_tangoСаша Туманов
14.08.2014 17:32

Очень беспокоит один вопрос, на который не нашел ответа в магазине симплдрим. Хочу купить, для начала, mSearch2 и в связи с этим хотелось бы понимать, что покупаю. В том смысле, как я могу дальше использовать этот код? Только в одном или во всех своих проектах? Могу ли я брать деньги за настроенные мной сайты с установленным купленным кодом? Как обстоят дела с обновлением? Появляется ли у меня приоритет в тех. поддержке? Если где то есть доступное описание этих моментов, пожалуйста дай ссылочку! Я бегло прочитал "Положения" в магазине, но это, кажется, не то.

bezumkinВасилий Наумкин
14.08.2014 17:48

В том смысле, как я могу дальше использовать этот код?

Как угодно.

Только в одном или во всех своих проектах?

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

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

Естественно.

Как обстоят дела с обновлением?

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

Появляется ли у меня приоритет в тех. поддержке?

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

_tangoСаша Туманов
14.08.2014 17:56

Полная ясность. Спасибо за оперативность :)

_tangoСаша Туманов
15.08.2014 20:35

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

bezumkinВасилий Наумкин
16.08.2014 01:16

&toPlaceholdersЕсли не пусто, mFilter2 сохранит все данные в плейсхолдеры: [[+filters]], [[+results]] и [[+total]] с префиксом, указанным в этом параметре. Например, если вы указжете &toPlaceholders=my., то получите: [[+my.filters]], [[+my.results]] и [[+my.total]]

http://docs.modx.pro/components/msearch2/snippets/mfilter2

_tangoСаша Туманов
16.08.2014 08:25

То есть при таком вызове


            [[!mFilter2?
                &limit=`10`
                &element=`msProducts`
                &fastMode=`0`
                &filters=`
                    parent:categories
                    ,msoption|color
                    ,msoption|size
                `
                &toPlaceholders=`cat`
            ]]
            [[+cat.filters]]

В [[+cat.filters]] должно, что то выводиться (там пусто), я правильно понял?

bezumkinВасилий Наумкин
16.08.2014 09:34

Точку после cat забыл.

_tangoСаша Туманов
16.08.2014 09:39

Уххххххх.. Центнер кирпичей уже произвел. Спасибо! )

_tangoСаша Туманов
16.08.2014 15:49

Все замечательно сверсталось и настроилось, спасибо! ) Пара вопросов появилась в процессе. Если хотя бы раз использовать фильтр, то даже если все галки потом убрать, то исчезает пагинация от 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> `
]]

И еще, у меня блоки с фильтрами в сайдбаре, сделаны скрывающимися. Вот можно где то хранить их состояние? Ну, в смысле, я могу сам их в куку сложить, но ведь состояния чекбоксов где то хранятся? Может и состояние блоков туда же? Есть для этого какой то простой способ?

bezumkinВасилий Наумкин
16.08.2014 16:13

Пагинация должна быть в блоке mse2_pagination, а у тебя просто pagination - вот скрипт её и не вставляет на страницу.

Состояние чекбоксов хранится в url, чтобы можно было давать прямые ссылки на результаты фильтрации. Состояние элементов оформления лучше хранить в куках юзера.

_tangoСаша Туманов
16.08.2014 16:22

Василий, ты потрясающе понятный человек. Спасибо :)

bezumkinВасилий Наумкин
16.08.2014 16:48

На здоровье!

_tangoСаша Туманов
23.08.2014 12:13

Василий привет! Обнаружилась такая ситуация. Для доступа к сайту есть два домена, на латинице и на кириллице, один ссылка на другой. И вот, когда попадаешь на страничку с каталогом с латинского домена (по сохраненной ссылке, например) и используешь на ней фильтр, то 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

Андрей88Андрей
02.09.2014 09:31

Доброго времени суток уважаемый Василий. Прошу написать мне пару строчек ясности, если это не совсем затруднидь вас. Если не ставить mimishop2 на сайт, будет ли работать mFilter2, если да, то как он будет подтягивать изображения с ресурсов?

У меня есть на сайте структурированный каталог, в каждом ресурсе есть TV поля для фильтрации + картинки. Реально ли выводить фильтром эти данные, или же необходимо грузить mimishop2.

bezumkinВасилий Наумкин
02.09.2014 10:10

Если не ставить mimishop2 на сайт

Для того, чтобы установить mimishop2 на сайт, его нужно сначала написать. Потому что есть miniShop2, а mimishop2 нет.

как он будет подтягивать изображения с ресурсов?

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

Реально ли выводить фильтром эти данные

Конечно. Можно попробовать дополнение в работе на http://tefile.modx.pro перед покупкой.

Андрей88Андрей
12.09.2014 06:58

Где можно посмотреть, как настраивать TV параметры в ресурсах, чтобы потом их вывести с помощью фильтров? У меня есть к примеру n-количество ресурсов с тремя TV 1. Марка 2. Тип кузова 3. Грузоподъемность (данные в числах, чтобы потом слайдером выводить) В каком виде мне сделать запрос, чтобы вывелись эти поля для сортировки с помощью фильтра? Подскажите плиз. Правильно ли я заполняю TV параметры? Или их нужно заполнять в самом TV а потом в ресурсе просто из возможных вариантов выбирать???

bezumkinВасилий Наумкин
12.09.2014 07:58

[[!mFilter2?
    &parents=`0`
    &filters=`
        tv|marka,
        tv|type_kuzov,
        tv|type_bus,
        tv|cargo,
        tv|for_what
    `
]]

http://docs.modx.pro/components/msearch2/snippets/mfilter2

Андрей88Андрей
12.09.2014 10:01

Спасибо, помогло! )) Только вот все выводится по английски: сортировка, лексиконы и т.д. Это из за того, что стоит включены два словаря английский и русский?! Мне надо они оба для поиска... Как по умолчанию сделать лексиконы русскими?

bezumkinВасилий Наумкин
12.09.2014 10:28

Прочитай, пожалуйста, что написано по ссылке, в самом конце.

Андрей88Андрей
12.09.2014 12:21

А где указывается то, что выводится в [[+results]] ??? У меня абракадабра выводится, единственным хорошим есть ссылка, которая реально ведет на нужную страницу.

Хочу сделать так, чтобы выводилась картинка и ссылка. Вот

bezumkinВасилий Наумкин
12.09.2014 12:27

&element - Сниппет, который будет вызываться для вывода результатов работы, по умолчанию - mSearch2.

http://docs.modx.pro/components/msearch2/snippets/mfilter2

Хочу сделать так, чтобы выводилась картинка и ссылка.

Укажи параметры для этого сниппета при вызове mFilter2 - они туда передадутся.

Андрей88Андрей
13.09.2014 08:25

Большое спасибо за качественную и реально полезную консультацию по MODX. Василий Наумкин - The Best!

bezumkinВасилий Наумкин
13.09.2014 09:15

На здоровье!

Mihan
13.09.2014 14:44

Василий, подскажи, пожалуйста. Разделил вывод и фильтр с помощью toPlaceholder. Все замечательно выводится. Но вот фильтры не работают. Что я не так делаю?

bezumkinВасилий Наумкин
13.09.2014 14:45

Для правильной работы необходимо, чтобы все элементы фильтра располагались в одном блоке с #mse2_mfilter. Именно так прописано с стандартном чанке tpl.mFilter2.outer.

Mihan
14.09.2014 11:22

Разместил все под один контейнер. Изменений нет.

https://file.modx.pro/files/e/b/7/eb7fd42f4fd7defdfc0d94ed728c71fa.png

bezumkinВасилий Наумкин
14.09.2014 13:12

Даже на картинке видно, что вывод результатов не попадает в этот блок.

Mihan
16.09.2014 10:11

Ну как не попадает? ColumnLeft - фильтр, ColumnRight - результат, оба блока в

.

Так же как на minishop2.com и mamaboutique http://take.ms/OkrkG

Mihan
17.09.2014 10:39

Василий, все же прошу помочь с этим вопросом. 3 дня ломаю голову, весь твой FAQ по компоненту прочел. Честно говоря, думал, что в этом курсе будут рассмотрены эти аспекты. А инфы меньше, чем в FAQе приложения.

bezumkinВасилий Наумкин
17.09.2014 11:06

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

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

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

Андрей88Андрей
17.09.2014 07:20

Здравствуйте уважаемый. У меня на странице подбора шасси все настроено благодаря Вам и работает: [[!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. ПОМОГИТЕ плиз.

bezumkinВасилий Наумкин
17.09.2014 07:44

В первом случае:

tv|cargo:number, ... &tplFilter.outer.tv|cargo

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

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

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

Ну не смешно уже.

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

Там даже картинка есть, как добавлять записи.

Больше я на такие вопросы отвечать не буду, имей совесть.

Андрей88Андрей
17.09.2014 07:59

Сори. Я просто тормоз!!! Не зря говорят, 7 раз отмерь и раз отрежь. Надо быть повнимательнее

bezumkinВасилий Наумкин
17.09.2014 08:02

Значит, нет значений для вывода фильтра.

То есть, ТВ параметр place у всех выводимых товаров пуст.

Андрей88Андрей
17.09.2014 08:05

Та нет, там все заполнено, просто я попрошу, чтобы мне очки купили. Не внимателен больно. TV был с приставкой s, ТО ЕСТЬ places

Андрей88Андрей
29.09.2014 13:58

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

bezumkinВасилий Наумкин
29.09.2014 14:03

Значит, делал что-то, не связанное с ней.

В консоли ошибка javascript.

Андрей88Андрей
29.09.2014 14:07

А как ее исправить?

bezumkinВасилий Наумкин
29.09.2014 14:14

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

А если сама - то пора вызывать охотников за приведениями.

Андрей88Андрей
29.09.2014 14:25

все, меня повесят на суку... Колупался с галереей, может она чего. Ладно пойду бэкап подымать

bezumkinВасилий Наумкин
29.09.2014 14:53

Без бэкапа никак, да.

Андрей88Андрей
30.09.2014 05:58

Я не знаю как оценить ваше последнее сообщение? Если здесь сарказм, то да я ХЗ как его решить ту гребанную проблему. А если в самом деле без бэкапа никак, тогда я так и сделаю.

bezumkinВасилий Наумкин
30.09.2014 06:16

Нет, не сарказм, без бэкапов действительно никуда.

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

Просто хотел морально поддержать, больше не буду, извини.

Андрей88Андрей
30.09.2014 06:19

Вчера сделал бэкап но ничего не поменялось. Я уже в панике. Не знаю что и думать. Наверное закажу недели две назад бэкап. А иначе выбора нет! P.S. За поддержку спасибо )

bezumkinВасилий Наумкин
30.09.2014 06:26

У тебя в коде страницы вот что

<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!

Андрей88Андрей
30.09.2014 06:36

БОЛЬШОЕ ВАМ СПАСИБО!!! Я сразу и не понял, что в этом куске кода подключение идет [[*showAd:is=1:then=\[\[$adLinks\]\]]]

Андрей88Андрей
13.10.2014 08:48

Прошу прощения за такой вопрос, но я не смог найти где править цвет ползунка slider хочу вместо голубого сделать красным. Сами якоря, которые тягать я нашел - это картинки, а вот полоску не могу поменять цвет... Подскажите где изменить.

bezumkin
Василий Наумкин
04.07.2022 23:34
Что-то странное у тебя произошло: миграция есть, и вроде как выполнена, но таблицы при этом отсутств...
inetlover
Александр Наумов
03.07.2022 20:36
Василий, спасибо! Все понятно!
bezumkin
Василий Наумкин
02.07.2022 20:28
Спасибо, поправил!
bezumkin
Василий Наумкин
30.06.2022 03:58
Есть ли возможность формировать &quot;friendly URL aliases&quot;, используя аналог translit MODx? ...
bezumkin
Василий Наумкин
27.06.2022 03:32
Спасибо за исправления, очень выручаешь =) Но учитывая количество не описаных в заметке дополнительн...
bezumkin
Василий Наумкин
27.06.2022 03:10
что будет использоваться для вывода многоуровневого меню Посмотри как работают комментарии на этом ...
bezumkin
Василий Наумкин
25.06.2022 11:56
Поправил, спасибо!
bezumkin
Василий Наумкин
21.06.2022 01:58
onLoad(data) { this.total = data.total }, и onLoad({total}) { this.total = total }, В нашем случ...
bezumkin
Василий Наумкин
20.06.2022 14:01
Прекрасно тебя понимаю, я когда сам в этом разбирался - голова дымилась. Но зато теперь прямо-таки п...
bezumkin
Василий Наумкин
20.06.2022 09:30
Не надо, оно по умолчанию так - я просто чуть более подробно написал.