
Посадочная страница под комбинацию фильтров
Задача: открыть подборку по двум условиям сразу — скажем, немецкие товары чёрного цвета — по адресу /catalog/nemeckie-chernye/, а не /catalog/made_in--germaniya/color--black/.
Почему настройками не обойтись
Адрес собирается по сегменту на каждый выбранный фильтр, а паттерн URL принадлежит одному ключу: он меняет вид сегмента, но не склеивает два фильтра в один. Поэтому придуманный адрес на комбинацию делается отдельной страницей, которая сама задаёт себе фильтры.
Страница с заданными фильтрами
1. Создайте ресурс с нужным адресом — nemeckie-chernye внутри каталога. Заголовок, описание и SEO-текст пишутся прямо в нём, как на обычной странице.
2. Заведите сниппет mFilterPreset:
<?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:
{'!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/Страница продолжит работать — роутер разберёт сегменты, а сниппет добавит те же значения поверх, — но красивым останется только входной адрес. Для посадочной страницы этого обычно достаточно: в поиск ведёт чистый адрес, а дальше идёт обычная навигация по фильтрам.
Снять заданное условие посетитель не сможет
Сниппет подставляет значения на каждый запрос, поэтому снятая в форме галочка вернётся. Если условие должно сниматься — не задавайте его, а приведите посетителя на обычную страницу категории ссылкой с нужными фильтрами.
Если условие должно быть жёстким
Когда подборка обязана остаться в своих границах — например, страница только немецких товаров, — условие задаётся не фильтром, а ограничением выборки:
{set $catalog = '!mFilter' | snippet : [
'element' => 'msProducts',
'parents' => 5,
'where' => ['Data.made_in' => 'Германия']
]}| Заданные фильтры | Ограничение выборки | |
|---|---|---|
| Адрес после клика | Условия уезжают в сегменты | Остаётся чистым |
| Видно в форме | Значения отмечены | Не видно |
| Посетитель снимет | Нет | Нет |
| Откуда берёт данные | Любой фильтр, включая опции | Поля товара через Data., поля ресурса |
Ограничение переживает AJAX-фильтрацию: оно входит в параметры вызова, а те сохраняются и восстанавливаются при каждом запросе. Опции MiniShop3 так не ограничить — они лежат в отдельной таблице, и для них остаются заданные фильтры.
Проверка
Откройте посадочную страницу и сверьте число найденных товаров с тем, что даёт та же пара фильтров на обычной странице категории. Затем выберите третий фильтр: выдача должна сузиться, а в адрес добавиться новый сегмент.
