Skip to content
  1. Компоненты
  2. MiniShop3
  3. Интерфейс админки
  4. Товар

Страница товара ​

Откройте товар в дереве ресурсов MODX. Карточка msProduct совмещает поля ресурса и данные магазина.

Структура вкладок ​

Документ ​

Стандартная вкладка MODX с полями ресурса:

ПолеОписание
pagetitleНазвание товара
longtitleРасширенный заголовок
descriptionMeta description
introtextКраткое описание
contentПолное описание
aliasURL-псевдоним
parentРодительская категория

Свойства товара ​

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

Стандартные секции (section_key из сида):

СекцияКлючПоля по умолчанию
Основные данныеmainarticle, weight, color, size, vendor_id, made_in
Цены и складpricingprice, old_price, stock
SEOseo(пустая, под ваши поля)
Дополнительноadditionaltags, new, favorite, popular

Настройка

Секции и поля: Утилиты → Поля товара (админка). Новое поле в БД: Cookbook extra fields, пример Оптовая цена.

Галерея ​

  • Загрузка через drag-and-drop
  • Сортировка перетаскиванием
  • Установка главного изображения
  • Редактирование описания

Подробнее: Галерея товара

Связи ​

Vue-вкладка ProductLinksTab. CRUD через Manager API (право msproduct_save):

МетодПуть
GET/api/mgr/product-data/{id}/links
POST/api/mgr/product-data/{id}/links — body { slave, link }
DELETE/api/mgr/product-data/{id}/links — body { link, master, slave } (batch ids[] не поддерживается)
GET/api/mgr/references/link-types
GET/api/mgr/references/products

Типы связей из справочника msLink: one_to_many, many_to_one, one_to_one, many_to_many. Настройка типов: Настройки → Связи товаров.

Категории ​

Vue-вкладка ProductCategoriesTab. Дерево: GET /api/mgr/product-data/{id}/categories/tree (сервис ms3_product_category_tree). Выбранные id уходят в resource POST как hidden name="categories" (JSON). Родительская категория (parent) в дереве заблокирована. Товар может состоять в нескольких доп. категориях через msCategoryMember.

Опции товара ​

Значения опций товара (настроенных в Настройки → Свойства товаров).

Начиная с v1.10.0-beta1

Вкладка полностью на Vue. Компонент ProductOptionField поддерживает все 10 типов опций: textfield, numberfield, textarea, checkbox, comboBoolean, combobox, comboMultiple, comboColors, comboOptions, datefield. Рядом со значением comboColors рисуется цветовой квадрат, comboOptions — это PrimeVue InputChips: ввод произвольных тегов с подсказками из ранее использованных значений.

Интерфейс группирует опции по option_group_id (msOptionGroup) и показывает их в вертикальных табах слева. Если группа одна — таб не показывается, поля идут списком.

Свой caption / description для категории. Если у связки «опция ↔ категория» задан свой caption (см. Настройки → Свойства товаров), в форме товара отображается именно он. Это то же значение, которое уходит на витрину.

Сохранение. Значения попадают в POST как options-{key} (single) или options-{key} с JSON-массивом (multi). Процессор MiniShop3\Processors\Product\Update в beforeSet собирает всё в ключ options. Utils::decodeOptionValue() разворачивает JSON-массив. afterSave вызывает OptionSyncService::saveProductOptions($productId, $options, removeOther: true). Ключи, отсутствующие в POST, из msProductOption удаляются.

Архитектура секций и полей ​

Хранение данных ​

ТаблицаОписание
ms3_page_sectionsСекции (разделы) страницы
ms3_product_fieldsПоля товара с настройками

Модель msPageSection ​

ПолеТипОписание
idintID секции
page_keystringКлюч страницы (product_data)
section_keystringУникальный ключ секции
hiddenboolСкрыта ли секция
sort_orderintПорядок сортировки
configjsonJSON, часто {"lexicon_key":"ms3_section_main"}
is_defaultboolСекция по умолчанию

Модель msProductField ​

ПолеТипОписание
idintID поля
namestringСистемное имя поля
labelstringОтображаемое название
descriptionstringПодсказка
xtypestringТип виджета
sectionintID секции
visibleboolВидимость
requiredboolОбязательность
sort_orderintПорядок в секции
widthintШирина в 12-колоночной сетке (1–12, по умолчанию 4)
configjsonДополнительные настройки
is_systemboolСистемное поле
is_defaultboolПоле по умолчанию

Управление секциями ​

Создание секции ​

Через интерфейс:

  1. Откройте Утилиты → Поля товара (админка)
  2. Нажмите «Добавить секцию»
  3. Заполните:
    • Ключ секции — уникальный идентификатор (латиница, например seo)
    • Ключ лексикона — для многоязычных названий (например ms3_section_seo)
    • Название — отображаемое название
  4. Сохраните

Через API (в 1.13.x отдельного POST нет: интерфейс добавляет секцию локально и сохраняет список):

http
PUT /api/mgr/config/sections/product_data
json
{
  "sections": [
    {
      "section_key": "seo",
      "lexicon_key": "ms3_section_seo",
      "hidden": false
    }
  ]
}

Из тела читаются hidden, is_default, lexicon_key и label (на верхнем уровне объекта секции). Порядок задаётся позицией элемента в массиве — присланный sort_order и вложенный config не обрабатываются.

Право записи: mssetting_save.

Редактирование секции ​

Кликните иконку редактирования рядом с секцией, измените параметры и сохраните.

Удаление секции ​

Внимание

При удалении секции все её поля перемещаются в раздел «Без секции» (section = 0).

Сортировка секций ​

Перетащите секции в нужном порядке в левой панели.

Управление полями ​

Добавление нового поля ​

Новые поля добавляются через Утилиты → Свои поля. Это создаёт:

  1. Колонку в таблице ms3_product_data
  2. Запись в ms3_product_fields

Настройка существующего поля ​

Через интерфейс:

  1. Откройте Утилиты → Поля товара (админка)
  2. Выберите секцию и кликните поле
  3. Настройте подпись, описание, секцию, виджет и видимость: ширина задаётся колонками сетки 1–12 (6 = половина строки, 12 = вся строка)
  4. Сохраните

Через API (тело только с обёрткой fields):

http
PUT /api/mgr/config/page-fields/product_data
json
{
  "fields": [
    {
      "name": "article",
      "label": "Артикул товара",
      "section": 1,
      "visible": true,
      "sort_order": 0,
      "width": 6
    }
  ]
}

Перемещение поля между секциями ​

Выберите новую секцию в выпадающем списке редактирования поля или измените section через API.

Сортировка полей ​

Перетащите поля в нужном порядке внутри секции.

Скрытие поля ​

Снимите в редактировании поля флаг «Видимость» и сохраните. Поле останется в базе данных, но не будет отображаться в карточке товара.

Типы виджетов (xtype) ​

Стандартные ​

ТипОписаниеИспользование
textfieldОднострочное текстовое полеАртикул, название
numberfieldЧисловое полеЦена, вес
textareaМногострочное полеОписание
xcheckbox / checkboxФлажокnew, popular, favorite
switchПереключатель (ToggleSwitch)Да/нет-переключатели
comboboxВыпадающий список с поискомВыбор из списка значений
colorpickerВыбор цветаЦвет товара
datefieldВыбор датыДата

Комбобоксы MiniShop3 ​

ТипОписание
ms3-combo-vendorВыбор производителя
ms3-combo-categoryВыбор категории
ms3-combo-autocompleteАвтодополнение из списка
ms3-combo-optionsВыбор из значений опций
ms3-combo-selectВыпадающий список (Vue)
ms3-combo-userВыбор пользователя
ms3-combo-customerВыбор клиента
ms3-combo-sourceВыбор Media Source

Файлы и расширенные ​

ТипОписание
filebrowserВыбор файла через Media Browser
imagebrowserВыбор изображения через Media Browser
fileЗагрузка файла
imageЗагрузка изображения
ms3-repeaterПовторяемые поля
ms3-key-valueПары ключ–значение

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

НастройкаОписаниеПо умолчанию
ms3_product_tab_extraПоказывать вкладку «Свойства товара»true
ms3_product_tab_optionsПоказывать вкладку опцийtrue
ms3_product_tab_categoriesПоказывать вкладку категорийtrue
ms3_product_remember_tabsЗапоминать активную вкладкуtrue
ms3_product_main_fieldsПоля вкладки «Документ»pagetitle, longtitle, ...
ms3_product_extra_fieldsДополнительные поляprice, article, ...

API-эндпоинты ​

Конфигурация полей ​

Получить все поля:

http
GET /api/mgr/config/page-fields/product_data

Ответ:

json
{
  "success": true,
  "data": {
    "fields": [
      {
        "name": "article",
        "label": "Артикул",
        "xtype": "textfield",
        "section": 1,
        "visible": true,
        "sort_order": 0,
        "width": 6
      }
    ],
    "sections": {
      "1": {
        "id": 1,
        "section_key": "main",
        "label": "Основные данные",
        "sort_order": 0
      }
    }
  }
}

Сохранение полей: PUT /api/mgr/config/page-fields/product_data, тело — массив fields (см. выше).

Секции ​

http
GET /api/mgr/config/sections/product_data

Создание, правка и порядок — через bulk PUT, см. раздел «Управление секциями».

Удалить секцию (по section_key, не по id):

http
DELETE /api/mgr/config/sections/product_data/{section_key}

Данные товара ​

http
GET /api/mgr/product-data/{product_id}
http
PUT /api/mgr/product-data/{product_id}

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

Секция SEO ​

Секция seo уже в сиде и по умолчанию без полей. Перенесите в неё нужные поля из main / additional или extra fields модели msProductData.

longtitle и description живут на вкладке «Документ» (ms3_product_main_fields), не в product_data.

Добавление своего поля ​

  1. Откройте Утилиты → Свои поля
  2. Выберите модель msProductData
  3. Создайте поле:
    • Имя: warranty_months
    • Тип: INT
    • xtype: numberfield
  4. Сохраните (создастся колонка в БД)
  5. Откройте Утилиты → Поля товара (админка)
  6. Переместите поле в нужную секцию
  7. Настройте label и описание

Расширение через плагины ​

Событие msOnManagerCustomCssJs добавляет свой CSS/JS на страницу товара:

php
<?php
// Плагин: MyProductExtension
// События: msOnManagerCustomCssJs

if ($modx->event->name !== 'msOnManagerCustomCssJs') return;

$page = $modx->event->params['page'] ?? '';

if ($page === 'product_update' || $page === 'product_create') {
    $modx->regClientCSS('/assets/components/mycomponent/css/product.css');
    $modx->regClientStartupScript('/assets/components/mycomponent/js/product.js');
}

Связанные страницы ​