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

mFilterNav ​

Сниппет выводит список ссылок на значения фильтров: цвета, производителей, разделы. Подходит для SEO-перелинковки в футере или боковой колонке, облака характеристик, фильтров-ссылок вместо чекбоксов. Чанки и CSS-классы задаются как в pdoMenu.

Каждая ссылка — SEO-адрес раздела с одним фильтром: /catalog/color--red/. Сортировки, лимита и номера страницы в ней нет. Разделитель берётся из настройки mfilter.url_separator. Если значений нет, сниппет ничего не выводит — заголовок вокруг вызова останется без списка.

Параметры ​

Основные ​

ПараметрПо умолчаниюОписание
parents0 (текущий)ID одного раздела: по нему выбираются товары, и на него ведут ссылки. Несколько ID не поддерживаются
filterKeys—Ключи текстовых фильтров набора через запятую: опции, производитель, раздел. Числовые диапазоны — цена, вес — не поддерживаются

Источник товаров ​

ПараметрПо умолчаниюОписание
element—Сниппет, который выбирает товары раздела: msProducts, pdoResources. Нужен, если товары раздела выбирает свой сниппет; без него товары берутся обходом дочерних ресурсов
depth10Глубина обхода

Остальные параметры вызова передаются сниппету element — например, where для msProducts.

Если выше на странице вызван mFilter с &element, навигация берёт его товары, а parents, element и depth для выбора значений не действуют.

Чанки ​

ПараметрПо умолчаниюОписание
tpl@INLINE <li class="{$classNames | esc}"><a href="{$url | esc}">{$label | esc}</a></li>Чанк одного пункта. Значение задано свойством сниппета и перебивает разметку из кода. Свою разметку передавайте параметром вызова, свойство не очищайте — пустое свойство выводит дамп переменных
tplOuter@INLINE <ul class="{$outerClass | esc}">{$output}</ul>Внешняя обёртка
tplGroup—Обёртка группы пунктов. Группа — одна на каждый ключ фильтра
tplHere—Чанк активного пункта

CSS-классы ​

ПараметрПо умолчаниюОписание
firstClassfirstКласс первого пункта — отдельно в каждом ключе фильтра
lastClasslastКласс последнего пункта — отдельно в каждом ключе фильтра
hereClassactiveКласс активного пункта
rowClass—Класс всех пунктов
outerClass—Класс внешней обёртки

Активным считается значение, выбранное в SEO-адресе текущей страницы. С фильтрами в строке запроса пункт не отмечается. Раздел не сверяется: навигация по другому разделу тоже отметит значение, выбранное на текущей странице.

Значения и сортировка ​

ПараметрПо умолчаниюОписание
showCountfalseСчитать число товаров для каждого значения и передать в чанк флаг {$showCount}. Стандартный чанк число не выводит — задайте свой tpl с {$count}, как в примере
hideEmptytrueСкрывать значения без товаров в разделе. Если выключить и его, и showCount, выводятся все значения ключа из всего каталога, без привязки к разделу
sortBylabelСортировка: label или count
sortDirASCНаправление: ASC или DESC
limit0Число значений на каждый ключ фильтра (0 — все)

Кэширование ​

ПараметрПо умолчаниюОписание
cachefalseВключить кэширование. Для SEO-навигации рекомендуется
cacheTime3600Время жизни кэша, секунды

Чанки и классы в ключ кэша не входят: два вызова с одинаковыми ключами фильтров и разной разметкой при cache = 1 выведут разметку первого. Включайте кэш только у одного такого вызова.

Переменные чанков ​

tpl / tplHere ​

ПеременнаяОписание
{$url}SEO-адрес раздела с этим значением фильтра
{$label}Подпись: само значение; для ключей parent, parents, category, categories — пункт меню или заголовок раздела; для vendor_id с MiniShop3 — имя производителя
{$value}Исходное значение
{$slug}Слаг значения
{$filterKey}Ключ фильтра
{$count}Число товаров раздела с этим значением. 0, если выключены и showCount, и hideEmpty
{$hasCount}Всегда true; оставлен для старых чанков
{$showCount}Значение параметра showCount
{$idx}Номер пункта в ключе фильтра, с 1
{$isActive}true, если значение выбрано в SEO-адресе текущей страницы
{$isFirst}true, если пункт первый в ключе фильтра
{$isLast}true, если пункт последний в ключе фильтра
{$classNames}Собранные CSS-классы пункта

tplOuter ​

ПеременнаяОписание
{$output}HTML всех пунктов, а с tplGroup — всех групп
{$outerClass}Класс обёртки

tplGroup ​

ПеременнаяОписание
{$output}HTML пунктов группы
{$filterKey}Ключ фильтра
{$count}Число пунктов в группе

Примеры ​

fenom
<nav class="brands-nav">
    <h3>Производители</h3>
    {'!mFilterNav' | snippet : [
        'parents' => $_modx->resource.id,
        'filterKeys' => 'vendor_id'
    ]}
</nav>
fenom
{'!mFilterNav' | snippet : [
    'parents' => $_modx->resource.id,
    'filterKeys' => 'color',
    'element' => 'msProducts',
    'showCount' => true,
    'hideEmpty' => true,
    'tpl' => '@INLINE <li class="{$classNames | esc}">
        <a href="{$url | esc}">{$label | esc} ({$count})</a>
    </li>'
]}

Несколько фильтров с группировкой ​

fenom
{'!mFilterNav' | snippet : [
    'parents' => $_modx->resource.id,
    'filterKeys' => 'vendor_id,color,size',
    'tplGroup' => '@INLINE <div class="filter-group">
        <h4>{$filterKey}</h4>
        <ul>{$output}</ul>
    </div>',
    'tplOuter' => '@INLINE <div class="filter-nav">{$output}</div>'
]}

Топ-10 популярных значений ​

fenom
{'!mFilterNav' | snippet : [
    'parents' => $_modx->resource.id,
    'filterKeys' => 'vendor_id',
    'element' => 'msProducts',
    'showCount' => true,
    'sortBy' => 'count',
    'sortDir' => 'DESC',
    'limit' => 10,
    'tpl' => '@INLINE <li class="{$classNames | esc}"><a href="{$url | esc}">{$label | esc} ({$count})</a></li>'
]}

Горизонтальное меню ​

Меню в разметке Bootstrap: класс active Bootstrap ждёт на ссылке, поэтому чанк ставит его сам по {$isActive}.

fenom
{'!mFilterNav' | snippet : [
    'parents' => $_modx->resource.id,
    'filterKeys' => 'category',
    'outerClass' => 'nav nav-pills',
    'rowClass' => 'nav-item',
    'tpl' => '@INLINE <li class="{$classNames | esc}">
        <a class="nav-link{if $isActive} active{/if}" href="{$url | esc}">{$label | esc}</a>
    </li>'
]}

Свой чанк и класс активного пункта ​

fenom
{'!mFilterNav' | snippet : [
    'parents' => $_modx->resource.id,
    'filterKeys' => 'color',
    'hereClass' => 'is-selected',
    'tplHere' => '@INLINE <li class="{$classNames | esc}">
        <span class="current">{$label | esc}</span>
    </li>'
]}

Перелинковка в футере ​

fenom
<footer>
    <div class="footer-links">
        <div class="footer-col">
            <h4>Популярные производители</h4>
            {'!mFilterNav' | snippet : [
                'parents' => 5,
                'filterKeys' => 'vendor_id',
                'limit' => 10,
                'sortBy' => 'count',
                'sortDir' => 'DESC',
                'element' => 'msProducts'
            ]}
        </div>
        <div class="footer-col">
            <h4>По цвету</h4>
            {'!mFilterNav' | snippet : [
                'parents' => 5,
                'filterKeys' => 'color',
                'element' => 'msProducts',
                'hideEmpty' => true
            ]}
        </div>
    </div>
</footer>

На странице каталога, где выше вызван mFilter с &element, такая навигация считает значения по товарам этой страницы, а ссылки ведут в раздел 5. Выводите перелинковку на другой раздел на страницах без mFilter.

Быстрый выбор в боковой колонке ​

fenom
<aside class="catalog-sidebar">
    {* Основная форма фильтров *}
    {'!mFilterForm' | snippet}

    {* Дополнительная текстовая навигация *}
    <div class="sidebar-links">
        <h4>Быстрый выбор</h4>
        {'!mFilterNav' | snippet : [
            'filterKeys' => 'vendor_id,color',
            'limit' => 5,
            'showCount' => true,
            'element' => 'msProducts',
            'tpl' => '@INLINE <li class="{$classNames | esc}"><a href="{$url | esc}">{$label | esc} ({$count})</a></li>'
        ]}
    </div>
</aside>

limit действует на каждый ключ: здесь выйдет до пяти производителей и до пяти цветов.

Отличие от mFilterForm ​

mFilterFormmFilterNav
Форма: чекбоксы, слайдерыТолько ссылки
AJAX-обновлениеПереход по URL
Комбинирование фильтровОдин фильтр на ссылку
Обновляется после фильтрации без перезагрузкиОстаётся как при загрузке страницы: числа и отметка активного пункта не меняются