Напишите нам в WhatsApp
+7(906) 943-40-17
Сохраните этот номер в контактах и вы сможете написать нам в WhatsApp.
Или оставьте номер и мы сами напишем вам в WhatsApp
Условиями о персональных данных
Кнопка закрыть
Спасибо!
Спасибо, что оставили заявку.
Мы обработаем вашу заявку и обязательно позвоним!
Кнопка закрыть
Форма заявки
Оставьте ваши контакты,
мы обязательно с вами свяжемся
Ваше имя
Номер телефона (Перезвоним Вам)
Комментарий
Отправляя форму вы соглашаетесь с политикой конфиденциальности
пн-вс с 9:00 до 21:00
Почта: hello@redbe.ru
Уже есть сайт?
Сделаем бесплатный аудит с точки зрения маркетинга и SEO

Как программно создать опцию товара в 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.

Проверка результата

  1. Откройте товар с ID 1362 в менеджере — вкладка «Опции» должна содержать test_option со значением «привет опция2».
  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.