Skip to content
mFilter
mFilter
Фасетная фильтрация для MODX 3 с поддержкой SEO URL
  1. Компоненты
  2. mFilter
  3. Разработка
  4. Модели и БД

Модели и база данных

Все таблицы и xPDO-модели mFilter. Для актуальности версии: 1.4.0+.

Соглашения

  • Префикс таблиц — mfl_. Полное имя зависит от table_prefix MODX ({prefix}_mfl_*).
  • Поля даты-времени называются created_at / updated_at (тип datetime).
  • Поля сортировки — sort_order или priority (вместо зарезервированного MySQL 8 слова rank).
  • JSON-данные хранятся в полях типа text с phptype json — xPDO сам делает сериализацию.

Полный список таблиц

ТаблицаМодельНазначение
mfl_filter_setsMflFilterSetНаборы фильтров
mfl_filter_set_resourcesMflFilterSetResourceПривязки наборов к ресурсам
mfl_slugsMflSlugSEO-алиасы значений фильтров
mfl_patternsMflPatternПаттерны URL-сегментов
mfl_seo_templatesMflSeoTemplateШаблоны title/h1/description
mfl_word_formsMflWordFormСловоформы для склонения значений
mfl_tv_indexMflTvIndexДенормализованный индекс TV-значений
mfl_facet_index_textMflFacetIndexTextИндекс текстовых значений фильтров (1.4.0+)
mfl_facet_index_numMflFacetIndexNumИндекс числовых значений фильтров (1.4.0+)
mfl_cacheMflCacheКэш промежуточных результатов
mfl_request_runsMflRequestRunРегистрация runs больших списков ID (1.4.0+)
mfl_request_idsMflRequestIdsСписки ID для JOIN-замены IN(...) (1.4.0+)
mfl_warmup_configsMflWarmupConfigКонфигурации прогрева кэша (legacy с 1.4.0)
mfl_warmup_config_resourcesMflWarmupConfigResourceПривязки конфигураций прогрева к страницам (legacy)

Конфигурация фильтров

MflFilterSet

Набор фильтров. Один FilterSet привязывается к категориям через MflFilterSetResource.

ПолеТипОписание
idint unsigned PKID набора
namevarchar(255)Название
descriptiontext NULLОписание
filterstext (JSON)Конфигурация фильтров
inherittinyint(1) default 1Наследовать привязку на дочерние ресурсы
sort_orderint default 0Порядок сортировки в админке
activetinyint(1) default 1Активен
created_atdatetime NULL
updated_atdatetime NULL

Индексы: PRIMARY(id), idx_active(active), idx_sort_order(sort_order).

Структура filters (JSON):

json
{
  "vendor_id": {
    "type": "vendors",
    "source": "product",
    "label": "Производитель",
    "enabled": true
  },
  "color": {
    "type": "default",
    "source": "option",
    "field": "color",
    "label": "Цвет",
    "enabled": true
  },
  "price": {
    "type": "number",
    "source": "product",
    "field": "price",
    "label": "Цена",
    "enabled": true
  }
}

Доступные значения type: default, number, boolean, vendors, colors, parents, date, month, year, day + любые зарегистрированные через OnMFilterInit.

Доступные значения source: product (msProductData), option (msProductOption), tv, resource (modResource поле). См. Свой тип фильтра.

Пример работы:

php
use MFilter\Model\MflFilterSet;

// Получить набор
$filterSet = $modx->getObject(MflFilterSet::class, 1);
$filters = $filterSet->get('filters'); // уже массив (xPDO json)

// Создать набор
$filterSet = $modx->newObject(MflFilterSet::class);
$filterSet->fromArray([
    'name' => 'Каталог',
    'filters' => ['color' => ['type' => 'default', 'source' => 'option', 'field' => 'color']],
    'active' => 1,
]);
$filterSet->save();

MflFilterSetResource

Привязка набора к ресурсу. Один ресурс может быть привязан только к одному набору (uk_resource).

ПолеТипОписание
idint unsigned PKID привязки
filter_set_idint unsignedID набора
resource_idint unsignedID ресурса
created_atdatetime NULL

Индексы: PRIMARY(id), UNIQUE uk_resource(resource_id), idx_filter_set(filter_set_id).

Подсказка

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

php
use MFilter\Model\MflFilterSetResource;

$binding = $modx->newObject(MflFilterSetResource::class);
$binding->fromArray(['filter_set_id' => 1, 'resource_id' => 5]);
$binding->save();

// Найти набор для ресурса
$filterSet = $mfilter->getFilterSetManager()->getForResource($resourceId);

SEO

MflSlug

SEO-алиас значения фильтра. Уникальность по (filter_key, value, culture_key) и (filter_key, slug, culture_key).

ПолеТипОписание
idint unsigned PK
filter_keyvarchar(100)Ключ фильтра (color, vendor_id, ...)
valuevarchar(255)Оригинальное значение
slugvarchar(255)SEO-алиас
sourcevarchar(50)Источник: option, product, tv, resource, vendor, segment_builder
culture_keyvarchar(20) NULLЯзыковой ключ
is_customtinyint(1) default 0Slug отредактирован вручную (не пересоздавать автоматически)
activetinyint(1) default 1
created_atdatetime NULL
updated_atdatetime NULL

Индексы: PRIMARY(id), UNIQUE uk_filter_value_culture(filter_key, value, culture_key), UNIQUE uk_filter_slug_culture(filter_key, slug, culture_key), idx_slug(slug), idx_source(source), idx_culture(culture_key).

php
use MFilter\Model\MflSlug;

// Найти slug
$slugObj = $modx->getObject(MflSlug::class, [
    'filter_key' => 'vendor_id',
    'value' => 'Apple Inc.',
]);
$slug = $slugObj->get('slug'); // 'apple-inc'

// Создать (используйте SlugManager — он гарантирует уникальность)
$slug = $mfilter->getSlugManager()->getOrCreate('color', 'Красный', 'option', 'ru');

MflPattern

Паттерн URL-сегмента — определяет, как {key}_{value} парсится из URL.

ПолеТипОписание
idint unsigned PK
filter_keyvarchar(100)Ключ фильтра
url_patternvarchar(255)Шаблон URL-сегмента (dvigatel--{value}, {value}...)
hide_keytinyint(1) default 0Сегмент содержит только значение, без префикса ключа
parse_regexvarchar(255) NULLРегулярка для парсинга. При пустом — генерируется автоматически из url_pattern
parse_typevarchar(50) default defaultТип парсинга (default, range...)
priorityint default 100Приоритет применения паттерна (меньше = раньше)
activetinyint(1) default 1

Индексы: PRIMARY(id), UNIQUE uk_filter_key(filter_key), idx_priority(priority).

Подсказка

Поле parse_regex пустое в большинстве случаев — auto-generation из url_pattern появилась в 1.3.3 и закрывает 99% сценариев. Указывайте вручную только для нестандартных URL.

MflSeoTemplate

SEO-шаблоны для генерации title/h1/description на фильтрованных страницах.

ПолеТипОписание
idint unsigned PK
namevarchar(255)Название (для админа)
page_idint unsigned NULLID конкретного ресурса. NULL = шаблон применяется ко всем
filter_keystext (JSON)Массив ключей фильтров, к которым применим шаблон
h1_templatevarchar(500) NULLШаблон H1
title_templatevarchar(500) NULLШаблон title
description_templatetext NULLШаблон meta description
sort_orderint default 0Приоритет (меньше = раньше)
activetinyint(1) default 1
culture_keyvarchar(20) NULLЯзыковой ключ
created_atdatetime NULL
updated_atdatetime NULL

Индексы: PRIMARY(id), idx_page(page_id), idx_sort_order(sort_order), idx_culture(culture_key).

Структура filter_keys:

json
["vendor_id", "color"]

Шаблон срабатывает, если активные фильтры полностью совпадают с этим набором ключей. Подробнее: SEO шаблоны.

MflWordForm

Словоформы для склонения значений в SEO-текстах. Все 12 падежных форм + дополнительные «направительные» формы.

ПолеТипОписание
idint unsigned PK
filter_keyvarchar(100)Ключ фильтра
valuevarchar(255)Оригинальное значение
nomvarchar(255) NULLИменительный (кто? что?)
genvarchar(255) NULLРодительный (кого? чего?)
datvarchar(255) NULLДательный (кому? чему?)
accvarchar(255) NULLВинительный (кого? что?)
insvarchar(255) NULLТворительный (кем? чем?)
prevarchar(255) NULLПредложный (о ком? о чём?)
nom_pl ... pre_plvarchar(255) NULLТе же 6 форм во множественном числе
where_formvarchar(255) NULLФорма «где?» (в Москве)
to_formvarchar(255) NULLФорма «куда?» (в Москву)
from_formvarchar(255) NULLФорма «откуда?» (из Москвы)
culture_keyvarchar(20) NULLЯзыковой ключ
is_autotinyint(1) default 0Сгенерировано автоматически (через morpher.ru)
created_atdatetime NULL
updated_atdatetime NULL

Индексы: PRIMARY(id), UNIQUE uk_filter_value_culture(filter_key, value, culture_key), idx_filter(filter_key), idx_culture(culture_key).

Подробнее: Словоформы.


Индексы

MflTvIndex

Денормализованный индекс TV-значений. Заменяет JOIN к modTemplateVarResource при подсчёте suggestion'ов для TV-фильтров.

ПолеТипОписание
idint unsigned PK
resource_idint unsignedID ресурса
tv_idint unsignedID TV
tv_namevarchar(100)Имя TV (денормализовано для скорости)
valuevarchar(255)Значение TV
labelvarchar(255) NULLЧеловекочитаемая метка (для TV типа listbox)
created_atdatetime NULL

Индексы: PRIMARY(id), UNIQUE uk_resource_tv_value(resource_id, tv_id, value), idx_tv_value(tv_id, value), idx_tv_name_value(tv_name, value), idx_resource(resource_id).

Заполняется автоматически на OnDocFormSave (если mfilter.tv_index_on_save = true) и при ручной переиндексации.

MflFacetIndexText

Денормализованный индекс текстовых значений фильтров (бренды, цвета, размеры, made_in и т.п.). С версии 1.4.0.

ПолеТипОписание
filter_keyvarchar(64)Ключ фильтра (color, made_in, ...)
filter_valuevarchar(255)Значение фильтра (как в источнике)
product_idint unsignedID товара

Индексы: PRIMARY (filter_key, filter_value, product_id) — covering, обеспечивает уникальность и быстрые scan'ы по leftmost-prefix; idx_product(product_id) — для DELETE при пересборке для конкретных товаров.

Внимание

Не используйте getCollection/getObject напрямую — таблица может содержать миллионы строк. Только через FacetIndexReader.

MflFacetIndexNum

Аналогично MflFacetIndexText, но для числовых фильтров (price, weight, height...).

ПолеТипОписание
filter_keyvarchar(64)Ключ фильтра
filter_valuedecimal(20,4)Числовое значение
product_idint unsignedID товара

Индексы: PRIMARY(filter_key, filter_value, product_id), idx_product(product_id).

php
$range = $mfilter->getFacetIndexReader()->getNumRange('price', $productIds);
// ['min' => 1990.0, 'max' => 89990.0, 'count' => 1234]

Кэш и runtime-таблицы

MflCache

Кэш промежуточных результатов фильтрации (suggestions, filtered IDs, base IDs прогрева).

ПолеТипОписание
idint unsigned PK
cache_keyvarchar(255)Ключ (формат: {prefix}_{resourceId}_{hash})
cache_valuemediumtextСериализованные данные (JSON)
created_atdatetime NULL
expires_atdatetimeВремя истечения

Индексы: PRIMARY(id), UNIQUE uk_cache_key(cache_key), idx_expires(expires_at).

Подробнее: Кэширование.

MflRequestRun

Регистрация одного «запроса с большим списком ID». Используется RequestIdsRegistry для замены WHERE id IN (30000) на JOIN.

ПолеТипОписание
idbigint unsigned PK auto_incrementrun_id, выдаётся атомарно
created_atint unsigned default 0UNIX timestamp создания

Индексы: PRIMARY(id), idx_created_at(created_at).

MflRequestIds

Сами списки ID, привязанные к run_id из MflRequestRun. Composite PK без отдельного id.

ПолеТипОписание
run_idbigint unsigned PKFK на MflRequestRun.id
product_idint unsigned PKID товара
created_atint unsigned default 0UNIX timestamp (для cleanup-задачи)

Индексы: PRIMARY(run_id, product_id), idx_created_at(created_at).

Жизненный цикл:

  1. Деструктор RequestIdsRegistry удаляет run и его строки в конце запроса
  2. Shutdown handler — на случай fatal-error
  3. Cron-задача mfl_cleanup_request_ids каждые 10 минут — страховка от kill -9

См. RequestIdsRegistry.


Прогрев (legacy)

Legacy с версии 1.4.0

Эти таблицы используются только для прогрева baseIds в AJAX-режиме. После полной стабилизации индекса фасетов они будут удалены.

MflWarmupConfig

Конфигурация прогрева — один сниппет (element + params), результаты которого сохраняются в кэш.

ПолеТипОписание
idint unsigned PK
namevarchar(255)Название
elementvarchar(100)Имя сниппета (msProducts, pdoResources...)
snippet_calltext NULLПолный вызов сниппета (для отладки)
paramstext (JSON)Параметры вызова
cache_key_hashvarchar(32)MD5 от element + params (уникальность)
activetinyint(1) default 1
auto_createdtinyint(1) default 0Создан автоматически из реального вызова mFilter
last_warmup_atdatetime NULLВремя последнего прогрева
last_duration_msint NULLДлительность последнего прогрева
last_product_countint NULLКоличество найденных товаров
created_atdatetime NULL
updated_atdatetime NULL

Индексы: PRIMARY(id), UNIQUE uk_cache_key_hash(cache_key_hash), idx_active(active).

MflWarmupConfigResource

Привязка конфигурации прогрева к страницам каталога.

ПолеТипОписание
idint unsigned PK
config_idint unsignedFK на MflWarmupConfig.id
resource_idint unsignedID ресурса
created_atdatetime NULL

Индексы: PRIMARY(id), UNIQUE uk_config_resource(config_id, resource_id), idx_config(config_id).


Миграции

При установке/обновлении пакета все таблицы создаются автоматически через резолвер _build/resolvers/resolve.tables.php.

Программное создание таблиц

php
$manager = $modx->getManager();

// Создать конкретную таблицу
$manager->createObjectContainer(\MFilter\Model\MflFilterSet::class);

// Добавить индекс вручную (если меняли metaMap)
$manager->addIndex(\MFilter\Model\MflSlug::class, 'idx_slug');

Изменения схемы между версиями

ВерсияЧто изменилось
1.4.0Добавлены mfl_facet_index_text, mfl_facet_index_num, mfl_request_runs, mfl_request_ids
1.2.0Добавлены mfl_warmup_configs, mfl_warmup_config_resources
1.1.0Удалена mfl_page_configs (заменена на mfl_filter_sets + mfl_filter_set_resources); поля rank/createdon переименованы в sort_order/created_at для совместимости с MySQL 8