lotoseu
@lotoseu

Почему событие OnStartIBlockElementUpdate не меняет значение свойства?

Хочу изменить значение свойства в зависимости от значения свойства, которое приходит с 1С, в момент изменения товара. Для этого использую событие OnStartIBlockElementUpdate, и почему-то изменяется значение после второго сохранения будто хранит в себе старое значение и его записывает, и только после второго сохранения сохраняет нужное значение.
Как проследить и как исправить такое поведение?

<?
define('CATALOG_IBLOCK_ID', 9);

// Событие при изменении товара в инфоблоке меняет активность в зависимости от значения активности, которое пришло с 1С

AddEventHandler("iblock", "OnStartIBlockElementUpdate", Array("CIBLockHandler", "ChangePropertyActive"));
class CIBLockHandler
{
  function ChangePropertyActive(&$arFields)
  {
	  if($arFields['IBLOCK_ID']==CATALOG_IBLOCK_ID){
		$db_props = CIBlockElement::GetProperty($arFields['IBLOCK_ID'], $arFields['ID'], array("sort"=>"asc"), array("CODE"=>"AKTIVNOST") );
		if($ar_props = $db_props->Fetch()){
			$el = new CIBlockElement; 
			if($ar_props['VALUE_XML_ID']=='true'){
				$arFields['ACTIVE'] = 'Y';
			}
			else
			{
				$arFields['ACTIVE'] = 'N';
			}
		}
	  }
  }
}?>
  • Вопрос задан
  • 35 просмотров
Пригласить эксперта
Ответы на вопрос 1
udjin123
@udjin123
PHP, Golang, React
Судя по описанию, у вас ошибка в последовательности обновления данных.

А именно тут, вы пробуете взять данные из базы которых еще нет, так как события вызывается до обновления элемента. И именно по этому срабатывает второй раз, так как это свойство появляется в базе.
$db_props = CIBlockElement::GetProperty($arFields['IBLOCK_ID'], $arFields['ID'], array("sort"=>"asc"), array("CODE"=>"AKTIVNOST") );


Думаю правильнее прицепляться к событиям обновления свойств и там уже менять активность элемента.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы