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

Дополнение: miniShop2

Приветствую всех. Может кто из уважаемых гуру подскажет, как изменять опции товара скриптом? Изменять основные свойства ресурса — не вопрос, но с опциями получается лажа. Догадываюсь куда копать, но если кто направит, буду признателен. Например, накидал простейший сниппет:
$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, 16:16    Виктор Долгий   G+  
3    604 0

Комментарии (5)

  1. Александр 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();
                     }
    }
    
    1. Виктор Долгий 01 сентября 2016, 13:03 # 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();
      			}
      		}
      	}
      }
      

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