Skip to content
mFilter
mFilter
Фасетная фильтрация для MODX 3 с поддержкой SEO URL
  • MODX 3
  • PHP 8.1
  • Vue 3
  1. Компоненты
  2. mFilter
  3. Интеграции
  4. mSearch

mSearch ​

Фильтры на странице поиска: mFilter сам ищет фразу через mSearch, оставляет из найденного товары своей области и фильтрует их. Нужен установленный пакет mSearch.

Базовая настройка ​

fenom
{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 вызывается первым и выводится через переменную — иначе форма посчитает значения не по найденным товарам.

Порядок результатов ​

Найденное идёт по релевантности. Если посетитель выбрал сортировку — в адресе или переключателем на странице, — по ней упорядочен весь результат поиска, на всех страницах.

Параметры ​

ПараметрПо умолчаниюОписание
searchVarmse_queryИмя параметра запроса с поисковой фразой

Оба работают только с &element. Подсветку, минимальную длину запроса и остальное настраивает mSearch — см. его документацию. mFilter эти параметры не читает.

Плейсхолдеры ​

С непустой фразой сниппет mFilter ставит плейсхолдеры. Читайте их ниже вызова mFilter:

ПлейсхолдерЧто содержит
mse.queryПоисковая фраза
mse.totalСколько найдено в области каталога
mfilter.totalСколько осталось после фильтров
fenom
{if $.get.query}
    <p>Поиск: {$.get.query | e}, найдено: {$_modx->getPlaceholder('mfilter.total')}</p>
{/if}

Ограничения ​

  • Фраза запоминается при загрузке страницы. Фильтрация без перезагрузки ищет по ней же. Чтобы искать заново, отправьте форму поиска обычным запросом.
  • Ничего не найдено — сниппет выводит только чанк tplEmpty, фильтры на такой странице не работают.

Набор фильтров ​

Привяжите набор к самой странице поиска — без привязки форма останется пустой. Набор для поиска по товарам MiniShop3:

json
{
    "vendor": {
        "type": "vendors",
        "label": "Производитель"
    },
    "price": {
        "type": "number",
        "source": "product",
        "label": "Цена"
    }
}

В редакторе набора это две строки. У vendor редактор подставит тип «Стандартный» — выберите «Производители» вручную:

КлючИсточникТипЗаголовок
vendorminiShop3 — данные товаровПроизводители — выбрать вручнуюПроизводитель
priceminiShop3 — данные товаровЧисловой (диапазон)Цена

Источники и типы — в Наборах фильтров.

Закрыть поиск от индексации ​

fenom
{if $.get.query}
    <meta name="robots" content="noindex, follow">
{/if}

Производительность ​

Индекс поиска строит mSearch — см. его документацию. Фильтрацию ускоряет индекс фасетов mFilter, а повторные запросы — его кэш, см. Кэширование.