Так как прямая передача цены товара с фронта в обработку является небезопасным и дестабилизирущим фактором, общий смысл работы с разными ценами одного товара сводится к передаче какого-либо идентификатора, по которому можно определить цену и название варианта.
Допустим, у нас есть такой конфиг 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;
}
}
}