Простая опция товара

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

Так как прямая передача цены товара с фронта в обработку является небезопасным и дестабилизирущим фактором, общий смысл работы с разными ценами одного товара сводится к передаче какого-либо идентификатора, по которому можно определить цену и название варианта.

Допустим, у нас есть такой конфиг MultiTV options, в который заносятся значения опции товара и соответствующие цены:

$settings['display'] = 'vertical';

$settings['fields'] = [
    'name' => [
        'caption' => 'Название опции',
        'type'    => 'text'
    ],
    'price' => [
        'caption' => 'Цена',
        'type'    => 'text'
    ],
];

$settings['templates'] = [
    'outerTpl' => '<select name="meta[myoption]">[+wrapper+]</select>',
    'rowTpl'   => '<option value="[+iteration+]">[+name+]</option>'
];

Нужно разместить выбор этой опции в форме добавления товара, (в данном примере это будет выпадающий список):

<form data-commerce-action="add">
  ...
  [[MultiTV? &tvName=`options`]]
  ...
</form>

Таким образом получится, что при добавлении товара в корзину на сервер будет отправлен порядковый номер варианта опции, который мы сможем перехватить в плагине на событие OnBeforeCartItemAdding и задать для добавляемой позиции соответствующую цену:

if ($modx->event->name == 'OnBeforeCartItemAdding') {
    $meta = $params['item']['meta'];

    // проверяем, задана ли опция
    if (!empty($meta['myoption']) && is_numeric($meta['myoption'])) {
        $json = json_decode($modx->runSnippet('MultiTV', [
            'tvName'  => 'options',
            'docid'   => $params['item']['id'],
            'offset'  => $meta['myoption'] - 1,
            'display' => 1,
            'toJson'  => 1,
        ]));

        // проверяем, существует ли заданная опция
        if (!empty($json)) {
            // заменяем цену, добавляем название опции
            $params['item']['price'] = $json[0]->price;
            $params['item']['options'][] = $json[0]->name;
        }
    }
}