Как программно создать опцию товара в modx minishop2, привзяать к категории и записать в нее значение
MiniShop2: как программно создать опцию товара и присвоить значение
В этой инструкции покажем, как через API MODX/xPDO и MiniShop2 создать опцию msOption, привязать её к категории msCategoryOption, а затем записать значение для конкретного товара (таблица modx_ms2_product_options).
Что такое опция? В MiniShop2 «опции» — настраиваемые характеристики товара (цвет, размер и т.п.), отличные от базовых полей товара. Описание опции хранится в msOption, значения для товара — в msProductOption.
Готовый рабочий пример
Код ниже:
- создаёт опцию test_option с подписью «тестовая опция» и типом textfield,
- привязывает её к категории с ID 750,
- записывает значение «привет опция2» для товара с ID 1362.
PHP‑скрипт (сниппет/Консоль)
<?php
/** @var modX $modx */
// === Шаг 0. Готовим miniShop2 ===
$miniShop2 = $modx->getService(
'miniShop2',
'miniShop2',
MODX_CORE_PATH . 'components/minishop2/model/minishop2/'
);
if (!$miniShop2) {
return 'Ошибка: не удалось загрузить miniShop2';
}
// Входные данные
$optionKey = 'test_option';
$optionCaption = 'тестовая опция';
$categoryId = 750;
$productId = 1362;
$optionValue = 'привет опция2';
$log = [];
$log[] = 'Старт скрипта...';
// === Шаг 1. Создаём (или берём существующую) опцию msOption ===
/** @var msOption $option */
$option = $modx->getObject('msOption', ['key' => $optionKey]);
if (!$option) {
$option = $modx->newObject('msOption');
$option->fromArray([
'key' => $optionKey,
'caption' => $optionCaption,
'type' => 'textfield', // корректный тип для текстового поля
'description' => 'Автосозданная опция для примера',
'active' => 1,
], '', true, true);
if (!$option->save()) {
return 'Ошибка: не удалось создать msOption';
}
$log[] = "Создана опция msOption: {$optionKey} (#{$option->get('id')})";
} else {
$log[] = "Опция уже существует: {$optionKey} (#{$option->get('id')})";
}
// === Шаг 2. Привязываем опцию к категории (msCategoryOption) ===
/** @var msCategoryOption $link */
$link = $modx->getObject('msCategoryOption', [
'option_id' => (int)$option->get('id'),
'category_id' => (int)$categoryId,
]);
if (!$link) {
$link = $modx->newObject('msCategoryOption');
$link->fromArray([
'option_id' => (int)$option->get('id'),
'category_id' => (int)$categoryId,
'active' => 1,
'required' => 0,
'value' => '', // дефолт по желанию
'rank' => 0,
], '', true, true);
if (!$link->save()) {
return 'Ошибка: не удалось создать связь msCategoryOption (опция ↔ категория)';
}
$log[] = "Опция {$optionKey} привязана к категории #{$categoryId}";
} else {
$log[] = "Связь опции с категорией уже существует (категория #{$categoryId})";
}
// === Шаг 3. Устанавливаем значение опции для товара ===
/** @var msProduct $product */
$product = $modx->getObject('msProduct', (int)$productId);
if (!$product) {
return "Ошибка: товар с ID {$productId} не найден";
}
// Берём текущие опции и обновляем значение
$options = (array)$product->get('options');
$options[$optionKey] = $optionValue;
// (пример добавления ещё одной произвольной опции)
// $options['tolshina'] = '93 мм';
// Устанавливаем массив обратно и сохраняем
$product->set('options', $options);
if (!$product->save()) {
return "Ошибка: не удалось сохранить значение опции для товара #{$productId}";
}
$log[] = "У товара #{$productId} установлено {$optionKey} = '{$optionValue}'";
// === (Опционально) Очистка кэша
$modx->cacheManager->clearCache();
$log[] = 'Кэш очищен';
return implode("\n", $log);
Пояснения по шагам
Шаг 0. Загрузка сервиса
Получаем сервис miniShop2 и убеждаемся, что он доступен. Без этого классы и процессоры пакета не будут загружены.
Шаг 1. Создание msOption
Опция описывает саму характеристику (ключ, заголовок, тип). Для текстового поля используйте тип textfield. Запись попадает в таблицу modx_ms2_options.
Шаг 2. Привязка к категории
Связь msCategoryOption нужна, чтобы опция отображалась и редактировалась у товаров этой категории в менеджере. Это удобно для массовой работы.
Шаг 3. Значение для товара
Значения опций задаём через поле options у товара (msProduct): читаем массив, меняем/добавляем ключ, записываем назад и сохраняем. MiniShop2 сам синхронизирует в таблицу modx_ms2_product_options.
Проверка результата
- Откройте товар с ID 1362 в менеджере — вкладка «Опции» должна содержать test_option со значением «привет опция2».
- В БД появятся записи:
- modx_ms2_options — описание опции test_option;
- modx_ms2_product_options — значение для товара 1362.
Частые вопросы и подводные камни
- Не видно опцию в менеджере? Проверьте привязку msCategoryOption и очистите кэш (Очистить кэш).
- Значение не сохраняется? Убедитесь, что ключ опции совпадает с $optionKey, и что вы используете запись через массив $product->get('options') → $product->set('options', $options).
- Множественные значения? Для «мульти» опций используйте массив значений: $options['color'] = ['Красный','Синий']; и соответствующий тип (например, combo-options).
- Импорт/массовое обновление? Оборачивайте в цикл по товарам или используйте процессоры MiniShop2.
Готово! Теперь вы можете автоматизировать создание и заполнение опций товаров в MiniShop2. При желании вынесите код в сниппет и параметризуйте $optionKey, $categoryId, $productId и $optionValue.

Напишите нам в WhatsApp



