
mSearch
Фильтры на странице поиска: mFilter сам ищет фразу через mSearch, оставляет из найденного товары своей области и фильтрует их. Нужен установленный пакет mSearch.
Базовая настройка
{set $results = '!mFilter' | snippet : [
'element' => 'msProducts',
'parents' => 0,
'searchVar' => 'query',
'limit' => 20
]}
<form action="{$_modx->resource.id | url}" method="get">
<input type="text" name="query" value="{$.get.query | e}" placeholder="Поиск...">
<button type="submit">Найти</button>
</form>
{'!mFilterForm' | snippet}
{$results}element—msProductsилиpdoResources. СниппетmSearchсюда не подходит: он не умеет возвращать список ID.parents— корень каталога или0. По умолчанию это сама страница поиска, а у неё нет товаров-потомков. Если в области нет товаров, mFilter сейчас показывает всё найденное по сайту, а итог расходится со страницами.searchVar— имя поля формы поиска.mFilterвызывается первым и выводится через переменную — иначе форма посчитает значения не по найденным товарам.
Порядок результатов
Найденное идёт по релевантности. Если посетитель выбрал сортировку — в адресе или переключателем на странице, — по ней упорядочен весь результат поиска, на всех страницах.
Параметры
| Параметр | По умолчанию | Описание |
|---|---|---|
searchVar | mse_query | Имя параметра запроса с поисковой фразой |
search | — | Поисковая фраза напрямую, вместо параметра из searchVar |
Оба работают только с &element. Подсветку, минимальную длину запроса и остальное настраивает mSearch — см. его документацию. mFilter эти параметры не читает.
Плейсхолдеры
С непустой фразой сниппет mFilter ставит плейсхолдеры. Читайте их ниже вызова mFilter:
| Плейсхолдер | Что содержит |
|---|---|
mse.query | Поисковая фраза |
mse.total | Сколько найдено в области каталога |
mfilter.total | Сколько осталось после фильтров |
{if $.get.query}
<p>Поиск: {$.get.query | e}, найдено: {$_modx->getPlaceholder('mfilter.total')}</p>
{/if}Ограничения
- Фраза запоминается при загрузке страницы. Фильтрация без перезагрузки ищет по ней же. Чтобы искать заново, отправьте форму поиска обычным запросом.
- Ничего не найдено — сниппет выводит только чанк
tplEmpty, фильтры на такой странице не работают.
Набор фильтров
Привяжите набор к самой странице поиска — без привязки форма останется пустой. Набор для поиска по товарам MiniShop3:
{
"vendor": {
"type": "vendors",
"label": "Производитель"
},
"price": {
"type": "number",
"source": "product",
"label": "Цена"
}
}В редакторе набора это две строки. У vendor редактор подставит тип «Стандартный» — выберите «Производители» вручную:
| Ключ | Источник | Тип | Заголовок |
|---|---|---|---|
vendor | miniShop3 — данные товаров | Производители — выбрать вручную | Производитель |
price | miniShop3 — данные товаров | Числовой (диапазон) | Цена |
Источники и типы — в Наборах фильтров.
Закрыть поиск от индексации
{if $.get.query}
<meta name="robots" content="noindex, follow">
{/if}Производительность
Индекс поиска строит mSearch — см. его документацию. Фильтрацию ускоряет индекс фасетов mFilter, а повторные запросы — его кэш, см. Кэширование.
