Skip to content
  1. Компоненты
  2. FlatFilters

FlatFilters

Преимущества

  1. Не требует установки на сервер сторонних библиотек или сервисов типа ElasticSearch или Sphinx.
  2. Высокая скорость фильтрации (менее 1 секунды при 100 000 товаров).
  3. Простота настройки, при использовании стандартных классов.
  4. Фильтрация по множественным значениям.
  5. Умеет фильтровать пользователей.
  6. Умеет фильтровать по полям тип migx с глубиной вложенности не более 1.
  7. Кастомизация логики с помощью плагинов.

Особенности

  1. Не умеет показывать количество совпадений по отдельным фильтрам.
  2. Умеет блокировать значения фильтров, которые точно вернут пустой результат.
  3. Возвращает результат в виде строки со списком id, но не готовый html или объект.
  4. Нет встроенного поиска.

Базовое использование

Установка зависимостей

Перед установкой компонента убедитесь, что у вас установлен компонент SendIt версии не ниже 2.0.0.

Установка компонента

Компонент доступен на сайте modstore.pro, поэтому вы можете установить его через стандартный установщик. Убедитесь что версия PHP на вашем сервере не ниже 7.4.

Добавление конфигурации

В верхнем меню в пункте "Пакеты" находим "Фильтрация". Кликаем и переходим к списку конфигураций фильтров, который изначально пуст.

Нажимаем кнопку "Добавить конфигурацию". Выбираем тип конфигурации: ресурсы, товары или пользователи. Вы можете добавить свой тип по этой инструкции.

Подсказка

Вы также можете копировать любую из существующих конфигураций, нажав жёлтую (или оранжевую или вторую слева в колонке Действия) кнопку в списке конфигурацией.

Настройка конфигурации

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

Шаг указывает на количество сущностей индексируемых за раз. Лучше всего оставить значение по умолчанию 100, если у вас производительный сервер можете увеличить.

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

Подсказка

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

Подсказка

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

Добавление фильтров

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

Подсказка

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

Каждому фильтру необходимо задать тип поля и тип сравнения. Тип поля определяет в каком формате будет хранится значение фильтра в БД, а тип сравнения определяет как будет сравниваться значение при фильтрации и, косвенно, в каком чанке (список, чекбоксы, слайдер, выбор даты) фильтр будет выведен на фронте.

Подсказка

Поля для фильтрации можно искать по ключу или по названию. Чтобы сопоставить ключу название добавьте соответсвующую запись словаря в пространство имён flatfilters в тему default в формате ff_frontend_ключ-фильтра.

Подсказка

Некоторые типы полей и типы сравнения несовместимы, поэтому все недоступные для данного типа поля типы сравнения блокируются.

Подсказка

Для типа сравнения множественный в SQL-запросе будет использован оператор IN значения внутри него будут строкой.

Подсказка

Для добавления фильтров по полям типа migx используйте ключ в формате tvname_fieldname.

Индексация конфигурации

Сохраняем конфигурацию и возвращаемся к общему списку. Тут находим созданную конфигурацию и нажимаем на зелёную кнопку Индексация.

Ждем пока бледно-зелёный фон заполнит всю строку и станет ярко-зелёным.

Время ожидания зависит от производительности вашего сервера и количества объектов требующих индексации.

Подсказка

Если индексация будет прервана, то повторное нажатие на кнопку Индексация возобновит процесс с момента остановки.

Подготовка шаблона

Внимание

Укажите список ID шаблонов, в которых будет использоваться фильтрация, в системной настройке ff_tpls.

Пока ждём можно подготовить шаблон. Там нужно вызвать сниппет ffGetFilterForm для вывода формы с фильтрами.

fenom
{set $pageLimit = 8}
{set $configId = 1}
{'!ffGetFilterForm' | snippet: [
    'configId' => $configId,    
    'wrapper' => 'tpl.ffForm',
    'priceTplOuter' => 'tpl.ffRange',
    'favoriteTplOuter' => 'tpl.ffCheckbox',
    'newTplOuter' => 'tpl.ffCheckbox',
    'popularTplOuter' => 'tpl.ffCheckbox',
    'colorTplOuter' => 'tpl.ffCheckboxGroupOuter',
    'colorTplRow' => 'tpl.ffCheckboxGroup',
    'defaultTplOuter' => 'tpl.ffSelect',
    'defaultTplRow' => 'tpl.ffOption',
    'createdonTplOuter' => 'tpl.ffDateRange',
]}

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

fenom
{'tpl.Info' | chunk}

Следом нужно вызывать сниппет Pagination для отображения результатов.

fenom
{set $presetName = 'filters.presetName' | placeholder}
<div class="row" data-pn-result="filters">
    {'!Pagination' | snippet: [
        'configId' => $configId,
        'snippet' => '!Pagination',
        'render' => '!msProducts',
        'presetName' => $presetName,
        'pagination' => 'filters',
        'resultBlockSelector' => '[data-pn-result="filters"]',
        'resultShowMethod' => 'insert',
        'hashParams' => 'filtersHash,sortby',
        'noDisabled' => 1,
        'tplEmpty' => '@INLINE <p>Товаров удовлетворяющих заданным параметрам не найдено.</p>',

        'limit' => $pageLimit,
        'parents' => 0,
        'sortby' => ['Data.weight' => 'ASC'],
        'tpl' => 'Чанк-вывода-товара',        
        'includeTVs' => 'modifications',
        'includeThumbs' => 'small',
        'showUnpublished' => 1
    ]}
</div>

И наконец сам блок пагинации не забудьте:

fenom
<!-- PAGINATION -->
{set $totalPages = 'filters.totalPages' | placeholder}
{set $limit = 'filters.limit' | placeholder}
<div data-pn-pagination="filters" data-pn-type="" class="{$totalPages < 2 ? 'v_hidden' : ''} d-flex justify-content-between flex-wrap py-5" style="gap:10px;">
    <button class="btn btn-warning w-100" type="button" data-pn-more>Загрузить ещё</button>
    <div class="d-flex align-items-center" style="gap:10px;">
        <button type="button" class="btn btn-primary" data-pn-first="1">&#10094;&#10094;</button>
        <button type="button" class="btn btn-primary" data-pn-prev>&#10094;</button>
        <input type="number" name="filterspage" data-pn-current data-si-preset="{$presetName}" form="filterForm" min="1" max="{$totalPages}"
               value="{$.get['filterspage']?:1}">
        <p class="d-flex align-items-center mb-0">из
            <span data-pn-total="">{$totalPages?:1}</span>
        </p>
        <button type="button" class="btn btn-primary" data-pn-next>&#10095;</button>
        <button type="button" class="btn btn-primary" data-pn-last="{$totalPages}">&#10095;&#10095;</button>
    </div>

    <p class="mb-0">Показывать по <input type="number" name="limit" data-pn-limit form="filterForm" min="1" max="96" value="{$limit?:12}"></p>
</div>

Логика работы

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

Подсказка

Соответствие типов и классов устанавливается в файле, путь к которому указывается в системной настройке ff_path_to_types, значение по умолчанию components/flatfilters/types.inc.php

Осторожно

Не редактируйте файл components/flatfilters/types.inc.php. Если требуется внести в него изменения - сделайте копию в другом месте.

При сохранении конфигурации в базе данных создаётся новая таблица для хранения индексов, она будет иметь имя ff_indexes_id-конфигурации. В этой таблице будут два обязательных поля id и rid, остальные поля соответствуют выбранным вами фильтрам.

Подсказка

При изменении типа фильтра и количества фильтров следует повторно произвести индексацию ресурсов.

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

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

Первый ffGetFilterForm выводит форму фильтрации и запускает фильтрацию, результаты фильтрации сохраняются в сессию.

Сниппет Pagination получает результат из сессии и рендерит его с помощью указанного вами в параметре render сниппета.

При изменении значений в фильтрах фильтрация будет запущена снова.

Фильтрация работает через плагин на событие OnBeforePageRender. В плагине вызывается метод getFilterResult(), который возвращает список id ресурсов, и устанавливается несколько важных значений.

Осторожно

FlatFilters не занимается рендерингом результатов и пагинацией.

Системные настройки

Подсказка

ff_allowed_tpls позволяет указать шаблоны, которые будут участвовать в индексации и для которых будут выбраны TV поля.

КлючОписаниеЗначение
ff_allowed_tplsРазрешённые для индексации шаблоны
ff_connectorИмя сниппета-коннектораffConnector
ff_js_config_pathПуть JavaScript конфигурации./flatfilters.inc.js
ff_js_pathПуть JavaScript фронтендаassets/components/flatfilters/js/web/flatfilters.js
ff_path_to_typesПуть к файлу с перечислением доступных типов конфигурацийcomponents/flatfilters/types.inc.php
ff_preset_namesИмя используемых пресетов{"filtering":"flatfilters","disabling":"ff_disabling","total":"ff_total"}
ff_show_groups_panel_forПоказывать панель выбора группы дляcustomers
ff_show_parents_panel_forПоказывать панель выбора родителя дляresources,products
ff_tplsШаблоны, в которых выводятся фильтры1