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

Фильтры на странице поиска

Фильтры по результатам поиска mSearch работают, если mFilter вызван раньше mFilterForm. mFilter находит товары по запросу, а форма строит значения фильтров по ним.

Задача

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

Решение

fenom
{'!mSearchForm' | snippet}

{* Сначала mFilter — вывод в переменную *}
{set $mfilterOutput = '!mFilter' | snippet : [
    'element' => 'msProducts',
    'parents' => 0,
]}

<aside>
    {'!mFilterForm' | snippet}
</aside>

<main>
    {$mfilterOutput}
</main>

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

mFilter берёт запрос из параметра mse_query — так его называет mSearchForm. Если в форме поиска параметр другой, укажите его: 'searchVar' => 'query'.

Почему так

Порядок вызова

mFilter находит товары по запросу и передаёт их форме плейсхолдером mfilter.baseIds. mFilterForm, вызванный раньше, плейсхолдера не видит и берёт товары самой страницы:

  • у отдельной страницы поиска товаров нет — форма останется без фильтров;
  • на разделе каталога форма покажет значения всего раздела, а не найденных товаров.

Вызов {set $mfilterOutput = … } выполняет mFilter сразу, а его вывод ставится ниже, в нужном месте разметки.

Где искать

Поиск работает только с &element. Найденные товары пересекаются с теми, что отбирает элемент:

parentsГде ищет
0 или корень каталогаВо всём каталоге
Раздел каталогаТолько в разделе
Страница без товаровБерёт все найденные mSearch

Фильтрация после поиска

Запрос сохраняется вместе с настройками вызова mFilter. Выбор фильтра в форме уходит AJAX-запросом, а сервер снова ищет по тому же запросу. Параметр mse_query остаётся в адресе.

Если не работает

СимптомПричина
На странице поиска форма пустаяmFilterForm вызван раньше mFilter или страница не привязана к набору фильтров
Числа у фильтров — по всему разделу, а не по найденномуmFilterForm вызван раньше mFilter
Выдача не меняется от запросаПараметр запроса в форме поиска не mse_query, а searchVar не указан. Или mFilter вызван без &element
Выбор фильтра не обновляет выдачуmFilter вызван с toPlaceholders: вывод теряет обёртку из tplOuter, и скрипту некуда вставлять товары