Виктор Долгий

Виктор Долгий

Был в сети 25 февраля 2021, 16:19
Заказы не принимаю
0
Вот так делал это я:

<?php
$serviceOption = 'replaceTextInOption';

$parentCategory = 641;
$getOptionKey = 'flavor_volume';
//$addText = 'Готовая база или основа';

$replaceTextInOptionFind = ' мл';
$replaceTextInOptionReplace = '';

if (!$parents = $modx->runSnippet('pdoResources', array('returnIds' => 1, 'parents' => $parentCategory, 'where' => array('class_key' => 'msCategory'), 'limit' => 0))) {
	$parents = $parentCategory;
}
// ! Добавить проверку, категория ли это товаров
$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 ($serviceOption == 'replaceTextInOption') {
			if ($data = $product->getOne('Data')) {
				$options = $data->get('options');
			}
			
			foreach ($options as $optionKey => $optionValues) {
				if ($optionKey == $getOptionKey) {
					//echo print_r($options) . '
';
					//echo print_r($optionValues) . '
';
					//$options[$dataKey][0] = str_replace($replaceTextInOptionFind, $replaceTextInOptionReplace, $dataValue[0]);
					
					if (is_array($optionValues)) {
						//return 777;
						foreach ($optionValues as $arrayNumber => $optionValue) {
							$options[$optionKey][$arrayNumber] = str_replace($replaceTextInOptionFind, $replaceTextInOptionReplace, $optionValue);
						}
						//sort($options[$optionKey]);
						//$options[$optionKey] = $optionValues;
						echo print_r($options) . '

';
					}
					$data->set('options', $options);
					$data->save();
					//return $dataKey;
				}
				//echo $dataKey;
			}
		}
		
		if ($serviceOption == 'replaceTextInField') {
			//$product->set('weight', '0.01');
			//$product->save();
		}
	}
}
Тут много мусора, но все же, думаю, разберешься. Ключевой момент — записать массив значений, в массиве опций, к нужной опции, а затем, сохранить весь массив опций.
0
Спасибо. Ты как всегда быстр и точен ;)

Кстати, скорость не замерял, но по ощущениям, стало быстрее. Еще одна ошибка валится, если на одной странице запустить последовательно несколько getTickets с выборкой из разных категорий:
Notice: Undefined index: on in /var/www/***/****/core/components/pdotools/model/pdotools/pdofetch.class.php on line 305
Настройки кэширования сниппета не влияют никак. Кэширование фенома отключено.
+1
Всё, заработало. Я не особо лазил в код, но фишка оказалось в том, что в форме продукта в плитке с классами .ms2_form.msoptionsprice-product вызов сниппета [[!msOptions]] должен стоять после скрытого инпута с name=«options». Ну, в принципе логично, но иногда тупикуешь из-за таких мелочей. Вам спасибо, прикуплю еще на один сайт дополнение ;)