Как скриптом изменить опции товара?

Приветствую всех. Может кто из уважаемых гуру подскажет, как изменять опции товара скриптом? Изменять основные свойства ресурса — не вопрос, но с опциями получается лажа. Догадываюсь куда копать, но если кто направит, буду признателен. Например, накидал простейший сниппет:
$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 '
';
	}
}
Все что касается ресурса — естественно сохраняет, а вот опции…
Виктор Долгий
30 августа 2016, 13:16
modx.pro
4
4 963
0

Комментарии: 5

Александр
30 августа 2016, 17:55
+2
Смотрим схему miniShop2

<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();
                 }
}
    Виктор Долгий
    01 сентября 2016, 13:03
    2
    0
    Судя по всему, сохранением опций заведует класс 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();
    			}
    		}
    	}
    }

    Вот так просто и работает. Над проверками особо не заморачивался, можно допилить, но это уже каждый сам для себя доделает.
      Андрей
      06 сентября 2016, 13:14
      0
      Тоже нужно записывать опции через API, возникла проблема, если у опции тип combo-box, и допустим несколько значений в нем 1,2,3, то в массиве $dataValue будет только 3. И как записывать несколько значений тоже не понятно.
        Володя
        06 сентября 2016, 13:37
        0
        логично что для установки нескольких значений нужен массив этих значений, смотрите что у вас присваивается в скрипте.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
5