Multicat Market
Плагин для модуля Market v5+ CMF Cotonti, позволяющий назначать одному товару (странице модуля Market) сразу несколько категорий структуры market. Вся реализация выполнена через стандартные хуки и отдельную таблицу связей, без изменений в ядре Cotonti и в самом модуле Market.
Оглавление
- Описание
- Принцип работы
- Установка
- Правки шаблонов
- Структура файлов
- Хуки и их назначение
- Функции плагина
- Административная панель
- Структура БД
- Языковые файлы
- Статус разработки
- Метаданные
1. Описание
Плагин Multicat Market добавляет возможность размещать один товар (страницу модуля Market) одновременно в нескольких категориях структуры market.
До установки плагина каждая страница Market могла принадлежать только одной категории — её код хранится в поле fieldmrkt_cat таблицы cot_market. После установки плагина:
- Основная категория по-прежнему хранится в поле
fieldmrkt_cat— это обеспечивает совместимость с ядром и другими расширениями. - Полный набор выбранных категорий (включая основную) дополнительно сохраняется в отдельной таблице
cot_market_multicats. - При редактировании товара вместо одного селекта категории выводится иерархический список чекбоксов — можно отметить произвольное число категорий.
- Первая выбранная категория автоматически становится основной и попадает в
fieldmrkt_cat.
2. Принцип работы
- Плагин регистрирует таблицу
cot_market_multicatsчерезCot::$db->registerTable('market_multicats'). - На хуке
market.edit.tagsгенерируются чекбоксы категорий и передаются в шаблон в виде тегов{MARKET_FORM_MULTICAT}и{MARKET_FORM_MULTICAT_HINT}. - При сохранении формы хук
market.edit.update.importберёт первую отмеченную категорию и записывает её код вfieldmrkt_cat. - После успешного обновления товара хук
market.edit.update.doneвызываетmulticatmarket_save_cats()и полностью перезаписывает связи товара с категориями вcot_market_multicats. - На фронтенде (список товаров, страница продавца) плагин расширяет условия выборки, добавляя к фильтру по
fieldmrkt_catпоиск по таблице связей. За счёт этого товар отображается во всех отмеченных категориях. - При удалении товара хук
market.delete.firstудаляет все связанные записи изcot_market_multicats, чтобы не оставалось «висячих» связей.
3. Установка
- Распаковать архив и загрузить папку
multicatmarketна сервер в каталогplugins/. - Зайти в админку: Расширения → Multicat Market → Установить.
- Внести правки в шаблоны (см. раздел Правки шаблонов).
- Готово: при редактировании карточки товара появится блок чекбоксов с категориями.
4. Правки шаблонов
4.1. market.edit.tpl
Сразу после стандартного селектора категорий добавить:
<!-- IF {PHP|cot_plugin_active('multicatmarket')} -->
<div class="col-12">
<label class="form-label fw-semibold">{PHP.L.multicatmarket_cats_edit}</label>
<div class="multicat-checkboxes">{MARKET_FORM_MULTICAT}</div>
<small class="form-text text-muted mt-1">{MARKET_FORM_MULTICAT_HINT}</small>
</div>
<!-- ENDIF -->При желании — дополнительно оформить контейнер через CSS:
<!-- IF {PHP|cot_plugin_active('multicatmarket')} -->
<style>
.multicat-checkboxes .form-check {
display: block;
margin-bottom: 0.75rem;
}
.multicat-checkboxes .form-check-label {
font-weight: normal;
cursor: pointer;
}
.multicat-checkboxes .form-check-input {
margin-right: 0.5rem;
}
</style>
<!-- ENDIF -->4.2. market.admin.tpl
В нужном месте (например, сразу после статуса) добавить:
<!-- IF {PHP|cot_plugin_active('multicatmarket')} -->
<div class="text-muted small">{ADMIN_PAGE_MULTICATS}</div>
<!-- ENDIF -->Важно: если не добавить эти теги в шаблон, множественные категории работать не будут — просто не будет формы выбора и вывода в админке.
5. Структура файлов
/multicatmarket/
├── inc/
│ └── multicatmarket.functions.php Основные функции работы с мультикатегориями
├── lang/
│ ├── multicatmarket.ru.lang.php Русский языковой файл
│ ├── multicatmarket.en.lang.php Английский языковой файл
│ └── multicatmarket.ua.lang.php Украинский языковой файл
├── setup/
│ └── multicatmarket.install.sql Создание таблицы + миграция существующих данных
├── tpl/
│ └── multicatmarket.admin.tpl Шаблон админ-панели
├── multicatmarket.admin.php Хук tools — административная панель
├── multicatmarket.admin.loop.php Хук market.admin.loop
├── multicatmarket.market.delete.first.php Хук market.delete.first
├── multicatmarket.market.edit.import.php Хук market.edit.update.import
├── multicatmarket.market.edit.tags.php Хук market.edit.tags
├── multicatmarket.market.edit.update.done.php Хук market.edit.update.done
├── multicatmarket.market.vendors.query.php Хук market.vendors.query
└── multicatmarket.setup.php Регистрация плагина и настроек
Прежняя документация упоминает также файл multicatmarket.market.list.query.php (хук market.list.query) и multicatmarket.global.php. О содержимом этих файлов в настоящей документации сведений нет.
6. Хуки и их назначение
| Файл | Хук | Назначение |
|---|---|---|
multicatmarket.admin.php | tools | Административная панель плагина: список связей, добавление, редактирование, очистка, статистика, массовые операции. |
multicatmarket.admin.loop.php | market.admin.loop | В админ-списке товаров Market выводит перечень категорий, в которых находится товар (тег {ADMIN_PAGE_MULTICATS}). |
multicatmarket.market.delete.first.php | market.delete.first | До удаления товара удаляет все записи из cot_market_multicats для этого page_id. |
multicatmarket.market.edit.import.php | market.edit.update.import | Импортирует выбранные категории из POST и записывает код первой категории в fieldmrkt_cat. Если POST пуст, но у товара уже есть основная категория в БД — сохраняет её. |
multicatmarket.market.edit.tags.php | market.edit.tags | Генерирует иерархический список чекбоксов категорий (с учётом прав на запись). Передаёт в шаблон {MARKET_FORM_MULTICAT} и {MARKET_FORM_MULTICAT_HINT}. |
multicatmarket.market.edit.update.done.php | market.edit.update.done | После успешного обновления товара вызывает multicatmarket_save_cats() и сохраняет связи. |
multicatmarket.market.vendors.query.php | market.vendors.query | Расширяет выборку продавцов: включает продавцов, чьи товары привязаны к текущей категории через таблицу cot_market_multicats. |
7. Функции плагина
Файл inc/multicatmarket.functions.php содержит:
multicatmarket_get_cats($page_id)— возвращает массивstructure_idкатегорий, в которых находится товар.multicatmarket_get_cat_titles($page_id)— возвращает массив названий категорий товара (используется в админке; учитывает перевод через плагинi18n4marketpro, если он активен).multicatmarket_save_cats($page_id, $cats)— полностью перезаписывает связи товара: удаляет старые записи и вставляет новые. Пустой массив — валидная операция (снятие всех мультикатегорий). Не путать с полемfieldmrkt_cat.
8. Административная панель
Открывается по адресу admin.php?m=other&p=multicatmarket. Реализована в стиле вкладок.
| Вкладка | Параметр URL | Назначение |
|---|---|---|
| Список связей | tab=list | Список товаров с их основной категорией и всеми мультикатегориями. Фильтры: категория, название, наличие связей. Поддерживает пагинацию и массовую очистку связей у выбранных товаров, а также очистку всех связей у отдельного товара. |
| Добавить связь | tab=add | Добавление одиночной связи «товар ↔ категория». |
| Редактирование связи | tab=edit | Служебная вкладка. Открывается из списка, чтобы изменить категорию конкретной существующей связи. В навигации не отображается. |
| Очистка мусора | tab=clean | Подсчёт и удаление «мусорных» записей: с нулевым pcat_cat_id, с несуществующим товаром, с несуществующей категорией. |
| Статистика | tab=stats | Общее количество связей, уникальных товаров и категорий, среднее число связей на товар, топ-10 категорий по количеству связей. |
| Массовые операции | tab=mass | Пакетная привязка товаров (по списку ID) к категории и пакетная отвязка от неё. |
9. Структура БД
Плагин создаёт одну таблицу: cot_market_multicats.
CREATE TABLE IF NOT EXISTS `cot_market_multicats` (
`pcat_page_id` int UNSIGNED NOT NULL,
`pcat_cat_id` mediumint UNSIGNED NOT NULL,
UNIQUE KEY `pcat_unique` (`pcat_page_id`, `pcat_cat_id`),
KEY `pcat_page_id` (`pcat_page_id`),
KEY `pcat_cat_id` (`pcat_cat_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
При установке выполняется миграция существующих товаров: их fieldmrkt_cat сопоставляется с structure_code из cot_structure, и для каждой валидной пары в новую таблицу добавляется одна запись.
INSERT IGNORE INTO `cot_market_multicats` (`pcat_page_id`, `pcat_cat_id`)
SELECT p.fieldmrkt_id, s.structure_id
FROM `cot_market` p
JOIN `cot_structure` s
ON p.fieldmrkt_cat = s.structure_code
WHERE p.fieldmrkt_id > 0
AND s.structure_id > 0
AND p.fieldmrkt_cat != ''
AND s.structure_area = 'market';
10. Языковые файлы
Плагин поставляется с русским (ru), английским (en) и украинским (ua) языковыми файлами. Файлы располагаются в каталоге lang/. Языковой файл подключается по текущему языку администратора.
11. Статус разработки
Часть вкладок административной панели плагина находится в стадии разработки. Их функционал может быть ограничен или работать некорректно. В языковом файле для этого предусмотрена отдельная строка $L['multicatmarket_warning_tab_under_develop']:
«Эта вкладка ещё на стадии разработки. Функционал ограничен и может работать некорректно.»
Наиболее стабильными являются вкладки Список связей (tab=list) и Редактирование связи (tab=edit). Остальные вкладки следует использовать с учётом возможных изменений в следующих версиях.
12. Метаданные
- Название: Multicat Market
- Пакет: multicatmarket
- Версия: 1.3.7
- Автор: webitproff
- Лицензия: BSD
- Совместимость: CMF Cotonti v1.0.0+, модуль Market v5+, PHP 8.4+, MySQL 8.0+
- Репозиторий: https://github.com/webitproff/cotonti-multicatmarket