Forum categories

Multicat Market - Плагин для CMF Cotonti

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

Привет , ты много пропустил
webitproff
Telegram for messages
@webitproff
webitproff • 2026-09-11 23:11 #1

Multicat Market

Плагин для модуля Market v5+ CMF Cotonti, позволяющий назначать одному товару (странице модуля Market) сразу несколько категорий структуры market. Вся реализация выполнена через стандартные хуки и отдельную таблицу связей, без изменений в ядре Cotonti и в самом модуле Market.


Оглавление

  1. Описание
  2. Принцип работы
  3. Установка
  4. Правки шаблонов
  5. Структура файлов
  6. Хуки и их назначение
  7. Функции плагина
  8. Административная панель
  9. Структура БД
  10. Языковые файлы
  11. Статус разработки
  12. Метаданные

1. Описание

Плагин Multicat Market добавляет возможность размещать один товар (страницу модуля Market) одновременно в нескольких категориях структуры market.

До установки плагина каждая страница Market могла принадлежать только одной категории — её код хранится в поле fieldmrkt_cat таблицы cot_market. После установки плагина:

  • Основная категория по-прежнему хранится в поле fieldmrkt_cat — это обеспечивает совместимость с ядром и другими расширениями.
  • Полный набор выбранных категорий (включая основную) дополнительно сохраняется в отдельной таблице cot_market_multicats.
  • При редактировании товара вместо одного селекта категории выводится иерархический список чекбоксов — можно отметить произвольное число категорий.
  • Первая выбранная категория автоматически становится основной и попадает в fieldmrkt_cat.

2. Принцип работы

  1. Плагин регистрирует таблицу cot_market_multicats через Cot::$db->registerTable('market_multicats').
  2. На хуке market.edit.tags генерируются чекбоксы категорий и передаются в шаблон в виде тегов {MARKET_FORM_MULTICAT} и {MARKET_FORM_MULTICAT_HINT}.
  3. При сохранении формы хук market.edit.update.import берёт первую отмеченную категорию и записывает её код в fieldmrkt_cat.
  4. После успешного обновления товара хук market.edit.update.done вызывает multicatmarket_save_cats() и полностью перезаписывает связи товара с категориями в cot_market_multicats.
  5. На фронтенде (список товаров, страница продавца) плагин расширяет условия выборки, добавляя к фильтру по fieldmrkt_cat поиск по таблице связей. За счёт этого товар отображается во всех отмеченных категориях.
  6. При удалении товара хук market.delete.first удаляет все связанные записи из cot_market_multicats, чтобы не оставалось «висячих» связей.

3. Установка

  1. Распаковать архив и загрузить папку multicatmarket на сервер в каталог plugins/.
  2. Зайти в админку: Расширения → Multicat Market → Установить.
  3. Внести правки в шаблоны (см. раздел Правки шаблонов).
  4. Готово: при редактировании карточки товара появится блок чекбоксов с категориями.

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.phptoolsАдминистративная панель плагина: список связей, добавление, редактирование, очистка, статистика, массовые операции.
multicatmarket.admin.loop.phpmarket.admin.loopВ админ-списке товаров Market выводит перечень категорий, в которых находится товар (тег {ADMIN_PAGE_MULTICATS}).
multicatmarket.market.delete.first.phpmarket.delete.firstДо удаления товара удаляет все записи из cot_market_multicats для этого page_id.
multicatmarket.market.edit.import.phpmarket.edit.update.importИмпортирует выбранные категории из POST и записывает код первой категории в fieldmrkt_cat. Если POST пуст, но у товара уже есть основная категория в БД — сохраняет её.
multicatmarket.market.edit.tags.phpmarket.edit.tagsГенерирует иерархический список чекбоксов категорий (с учётом прав на запись). Передаёт в шаблон {MARKET_FORM_MULTICAT} и {MARKET_FORM_MULTICAT_HINT}.
multicatmarket.market.edit.update.done.phpmarket.edit.update.doneПосле успешного обновления товара вызывает multicatmarket_save_cats() и сохраняет связи.
multicatmarket.market.vendors.query.phpmarket.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 
🗿

🧙‍♂️ Well met, good traveler! Fate has guided your steps to our humble realm. Here, wise sages and masters of the coding craft ⚒️📜 gather to unravel the mysteries of the code ✨⚙️, share their knowledge, and add new chapters to our chronicles.
⬅️ To the left lie ancient scrolls 📚 filled with forgotten wisdom. ⬆️ Straight ahead, friendly folk offer counsel 💬 to those in need. ➡️ To the right, you may become a chronicler ✍️ yourself, sharing your craft and leaving words of wisdom for those yet to come.
📝 Delay no longer—tell us the name by which you are known, complete the rite of registration 🛡️, and join our fellowship!
🏰 Our brotherhood holds no secret initiation, yet many halls remain closed to wandering guests, for some knowledge 💎 is reserved for those who choose to walk this path beside us.

Recommended Products in This Topic

Multiple Categories for a Single Product

The Multicat Market plugin adds the ability to place a single listing/product (Market module page) Modules and Plugins for Cotonti

Cotonti CMF: Plugin Installation, Integration, and Adaptation

professional services for the installation, deep integration and adaptation of plug-ins for Cotonti Support and Services Cotonti

Cotonti Services – Development, Support, SEO, Migration

Professional Cotonti services (Siena/Verona): plugin development, PHP 8.5 adaptation, themes, Support and Services Cotonti