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

mFilterNav ​

Сниппет для создания SEO-навигации на основе значений фильтров.

Описание ​

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

Применение:

  • SEO перелинковка в футере или сайдбаре
  • Навигация по брендам / производителям
  • Облако тегов / характеристик
  • Фильтры-ссылки вместо чекбоксов

Параметры ​

Основные ​

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

Источник данных (для счётчиков) ​

ПараметрПо умолчаниюОписание
element—Сниппет для получения ID (msProducts, pdoResources)
depth10Глубина поиска для element

Шаблоны (стиль pdoMenu) ​

ПараметрПо умолчаниюОписание
tplвстроенныйШаблон элемента ссылки
tplOuter@INLINE <ul>{$output}</ul>Внешняя обёртка
tplGroup—Обёртка группы (для группировки по filterKey)
tplHere—Шаблон активного элемента

CSS классы (стиль pdoMenu) ​

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

Поведение ​

ПараметрПо умолчаниюОписание
showCountfalseПоказывать количество товаров
hideEmptytrueСкрывать элементы с count=0
sortBylabelСортировка: label, count, sort_order
sortDirASCНаправление: ASC, DESC
limit0Лимит элементов (0 = без лимита)

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

ПараметрПо умолчаниюОписание
cachefalseВключить кэширование
cacheTime3600Время жизни кэша (секунды)

Плейсхолдеры в шаблонах ​

tpl / tplHere ​

ПлейсхолдерОписание
{$url}URL отфильтрованной страницы
{$label}Метка значения
{$value}Оригинальное значение
{$slug}Slug значения
{$filterKey}Ключ фильтра
{$count}Количество товаров
{$hasCount}true, если count доступен
{$showCount}Значение параметра showCount
{$idx}Порядковый номер (с 1)
{$isActive}true, если фильтр активен
{$isFirst}true, если первый элемент
{$isLast}true, если последний элемент
{$classNames}Собранные CSS классы

tplOuter ​

ПлейсхолдерОписание
{$output}HTML всех элементов
{$outerClass}Класс обёртки

tplGroup ​

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

Примеры ​

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

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

fenom
{'!mFilterNav' | snippet : [
    'parents' => $_modx->resource.id,
    'filterKeys' => 'brand,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' => 'brand',
    'element' => 'msProducts',
    'showCount' => true,
    'sortBy' => 'count',
    'sortDir' => 'DESC',
    'limit' => 10
]}

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

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

Со своим классом для активного ​

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

Алфавитный указатель ​

fenom
{* Сортировка по названию *}
{'!mFilterNav' | snippet : [
    'parents' => $_modx->resource.id,
    'filterKeys' => 'brand',
    'sortBy' => 'label',
    'sortDir' => 'ASC',
    'outerClass' => 'brand-index'
]}

SEO применение ​

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

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

    {* Дополнительная текстовая навигация *}
    <div class="sidebar-links">
        <h4>Быстрый выбор</h4>
        {'!mFilterNav' | snippet : [
            'filterKeys' => 'brand,color',
            'limit' => 5,
            'showCount' => true,
            'element' => 'msProducts'
        ]}
    </div>
</aside>

Отличие от mFilterForm ​

mFilterFormmFilterNav
Интерактивная формаСтатические ссылки
Чекбоксы, слайдерыТолько ссылки
AJAX обновлениеПереход по URL
Комбинирование фильтровОдин фильтр на ссылку
Для пользователяДля SEO / навигации

Рекомендации ​

  • Используйте hideEmpty для скрытия пустых значений
  • element нужен только если используете showCount или hideEmpty
  • Для SEO-навигации кэширование (cache => true) рекомендуется
  • Ограничивайте limit для длинных списков