Категории форума

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

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

Привет , ты много пропустил
webitproff
Телеграм для сообщений
@webitproff
webitproff • 11.09.2026 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 
🗿

🧙‍♂️ Радуйся, странниче добрый и честный! Не понапрасну привела тя стезя в земли сии. Зде бо мужи мудры и искусники дела писменнаго и численнаго, что куют словеса и плетут узоры кода, тайны разгадывают и знанием делятся, летописи множа и ремесло цифровое творя.
⬅️ Аще налево пойдеши — обрящеши грамоты древния, писания старинныя и свитки учения. ⬆️ Аще прямо — слово мудрое и совет от мужей разумеющих, что в деле кодописном искусны, получиши. ➡️ Аще направо — сам в писцы и летописцы внидеши, и в ремесло цифровое, где строки и знаки в дело живое обращаются, слово свое в память веков вложиши.
📝 Не медли же — нареки имя свое, и вниди в чин наш, и стань с нами в братстве, где код есть магия, а строки — заклятия живыя, числом и буквою слово едины суть.
🏰 Не тайно есть собрание сие, и не инициации в нем, но многое сокрыто от пришлых и ступалого, понеже не всякому открывается знание, но токмо ищущим и пребывающим в деле сем.

Рекомендуемые товары в этой теме

Multicat Market — множественные категории одного товара

Плагин добавляет возможность размещать одно объявление или товар (страницу модуля Market) Модули и Плагины для Cotonti

Установка, интеграция и адаптация плагинов под Cotonti CMF

профессиональные услуги по установке, глубокой интеграции и адаптации плагинов под Cotonti CMF, с Поддержка и услуги по Cotonti

Профессиональные услуги по Cotonti CMF (Siena/Verona)

Профессиональные услуги по Cotonti (Siena/Verona): создание плагинов, адаптация под PHP 8.5, темы, Поддержка и услуги по Cotonti