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

Посадочная страница под комбинацию фильтров ​

Задача: открыть подборку по двум условиям сразу — скажем, немецкие товары чёрного цвета — по адресу /catalog/nemeckie-chernye/, а не /catalog/made_in--germaniya/color--black/.

Почему настройками не обойтись ​

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

Страница с заданными фильтрами ​

1. Создайте ресурс с нужным адресом — nemeckie-chernye внутри каталога. Заголовок, описание и SEO-текст пишутся прямо в нём, как на обычной странице.

2. Заведите сниппет mFilterPreset:

php
<?php
// Фильтры, которых нет в адресе
$preset = [
    'made_in' => ['Германия'],
    'color'   => ['black'],
];

// Дополняем, а не перезаписываем: посетитель может выбрать что-то ещё,
// и плагин уже положил сюда то, что разобрал из адреса
$current = $modx->getPlaceholder('mfilter.filters');
if (!is_array($current)) {
    $current = [];
}

$modx->setPlaceholder('mfilter.filters', array_merge($preset, $current));

return '';

Значения пишутся так, как их хранит фильтр, — то же, что лежит в индексе и уходит в адрес до превращения в алиас.

3. Вызовите его в шаблоне ресурса до mFilter:

fenom
{'!mFilterPreset' | snippet}

{set $catalog = '!mFilter' | snippet : [
    'element' => 'msProducts',
    'parents' => 5
]}

<aside>{'!mFilterForm' | snippet}</aside>
<main>{$catalog}</main>

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

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

Что станет с адресом после клика ​

Заданные фильтры видны форме как выбранные, поэтому при первом же клике они уедут в адрес сегментами:

/catalog/nemeckie-chernye/made_in--germaniya/color--black/size--xl/

Страница продолжит работать — роутер разберёт сегменты, а сниппет добавит те же значения поверх, — но красивым останется только входной адрес. Для посадочной страницы этого обычно достаточно: в поиск ведёт чистый адрес, а дальше идёт обычная навигация по фильтрам.

Снять заданное условие посетитель не сможет

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

Если условие должно быть жёстким ​

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

fenom
{set $catalog = '!mFilter' | snippet : [
    'element' => 'msProducts',
    'parents' => 5,
    'where' => ['Data.made_in' => 'Германия']
]}
Заданные фильтрыОграничение выборки
Адрес после кликаУсловия уезжают в сегментыОстаётся чистым
Видно в формеЗначения отмеченыНе видно
Посетитель сниметНетНет
Откуда берёт данныеЛюбой фильтр, включая опцииПоля товара через Data., поля ресурса

Ограничение переживает AJAX-фильтрацию: оно входит в параметры вызова, а те сохраняются и восстанавливаются при каждом запросе. Опции MiniShop3 так не ограничить — они лежат в отдельной таблице, и для них остаются заданные фильтры.

Проверка ​

Откройте посадочную страницу и сверьте число найденных товаров с тем, что даёт та же пара фильтров на обычной странице категории. Затем выберите третий фильтр: выдача должна сузиться, а в адрес добавиться новый сегмент.