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

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

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

    Допустим, у нас есть такой конфиг 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;
            }
        }
    }