Как скриптом изменить опции товара?
Приветствую всех. Может кто из уважаемых гуру подскажет, как изменять опции товара скриптом? Изменять основные свойства ресурса — не вопрос, но с опциями получается лажа. Догадываюсь куда копать, но если кто направит, буду признателен. Например, накидал простейший сниппет:
$parents = $modx->runSnippet('pdoResources', array(
'returnIds' => 1,
'parents' => 2,
'where' => array('class_key' => 'msCategory'),
'limit' => 0
));
$parents = explode(",", $parents);
foreach ($parents as $parent) {
$resources = $modx->getCollection('msProduct', array('parent' => $parent));
foreach ($resources as $res) {
$data = $res->get('option');
echo 'data: '.$data.' ';
if ($data== '0') {
echo '-> ok';
$res->set('option', 'some data');
$res->save();
}
echo '
';
}
}
Все что касается ресурса — естественно сохраняет, а вот опции… Комментарии: 5
Смотрим схему miniShop2
Используем getMany:
<object class="msProduct" extends="modResource">
..............................
<composite alias="Options" class="msProductOption" local="id" foreign="product_id" cardinality="many"
owner="local"/>
</object>
Используем getMany:
foreach ($resources as $res) {
$data = $res->getMany('Options');
foreach ($data as $opt) {
.............
$opt->save();
}
}
Судя по всему, сохранением опций заведует класс msProductData, вот его и заставим работать. Мой пример с рабочего сайта, где нужно было к значению опции товара нужно было приписать текст. Также можно заменить значение, или обрабатывать поля с несколькими значениями, главное понимать, что нужно делать с массивами (опций):
Вот так просто и работает. Над проверками особо не заморачивался, можно допилить, но это уже каждый сам для себя доделает.
<?php
$parentCategory = 220;
$optionKey = 'base_nicotine';
$addText = 'мг/мл';
$parents = $modx->runSnippet('pdoResources', array('returnIds' => 1, 'parents' => $parentCategory, 'where' => array('class_key' => 'msCategory'), 'limit' => 0));
$parents = explode(",", $parents);
foreach ($parents as $parent) {
$products = $modx->getCollection('msProduct', array('parent' => $parent));
foreach ($products as $product) {
if (!($product instanceof msProduct)) {
return "The resource with id = {$product->id} is not instance of msProduct.";
}
if ($data = $product->getOne('Data')) {
$options = $data->get('options');
}
foreach ($options as $dataKey => $dataValue) {
if ($dataKey == $optionKey && !strpos($dataValue[0], $addText)) {
$options[$dataKey][0] = $dataValue[0].' '.$addText;
$data->set('options', $options);
$data->save();
}
}
}
}
Вот так просто и работает. Над проверками особо не заморачивался, можно допилить, но это уже каждый сам для себя доделает.
Тоже нужно записывать опции через API, возникла проблема, если у опции тип combo-box, и допустим несколько значений в нем 1,2,3, то в массиве $dataValue будет только 3. И как записывать несколько значений тоже не понятно.
логично что для установки нескольких значений нужен массив этих значений, смотрите что у вас присваивается в скрипте.
Вопрос создал modx.pro/help/9749/
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.