Компонент поиска и фильтрации 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Саша Туманов
15.08.2014 01:32

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

bezumkinВасилий Наумкин
15.08.2014 01:48

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

Как угодно.

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

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

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

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

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

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

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

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

_tangoСаша Туманов
15.08.2014 01:56

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

_tangoСаша Туманов
16.08.2014 04:35

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

bezumkinВасилий Наумкин
16.08.2014 09: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 16: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 17:34

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

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

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

_tangoСаша Туманов
16.08.2014 23: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Василий Наумкин
17.08.2014 00:13

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

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

_tangoСаша Туманов
17.08.2014 00:22

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

bezumkinВасилий Наумкин
17.08.2014 00:48

На здоровье!

_tangoСаша Туманов
23.08.2014 20: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 17:31

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

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

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

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

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

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

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

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

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

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

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

bezumkinВасилий Наумкин
12.09.2014 15: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 18:01

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

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

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

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

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

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

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

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

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

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

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

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

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

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

На здоровье!

Mihan
13.09.2014 22:44

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

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

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

Mihan
14.09.2014 19:22

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

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

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

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

Mihan
16.09.2014 18:11

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

.

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

Mihan
17.09.2014 18:39

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

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

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

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

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

Андрей88Андрей
17.09.2014 15: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 15:44

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

bezumkinВасилий Наумкин
30.09.2014 14: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 14:36

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

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

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

born2slip
pishnaa istntome
22.11.2022 14:06
огромное спасибо! )
inetlover
Александр Наумов
14.11.2022 10:19
посмотри документацию. Спасибо, что-то она мне не нагуглилась. Это просто функции объединения для о...
bezumkin
Василий Наумкин
10.11.2022 05:46
Спасибо за поздравления!
inetlover
Александр Наумов
09.11.2022 17:08
Посмотрел в ДевТулсе свойство overscroll-behavior: none; присутствует, проверил в Chrome и Chromium ...
bezumkin
Василий Наумкин
03.11.2022 20:57
Поискать в исходниках ссылки на её адрес и поменять - скорее всего только nuxt.config.js. А зачем эт...
ni.kolokol@mail.ru
Николай Каленников
03.11.2022 19:43
Спасибо. Попробую тоже с нуля переставить
inetlover
Александр Наумов
03.11.2022 19:24
Спасибо!!! Все заработало!
bezumkin
Василий Наумкин
28.10.2022 05:23
В тексте есть подсказка // Контроллер требует новое разрешение protected $scope = &#x27;ord...
bezumkin
Василий Наумкин
27.10.2022 13:25
Понял, спасибо!
inetlover
Александр Наумов
23.10.2022 13:33
Понял, спасибо!