Задача такая: в фиде количество товаров разбито по складам, при импорте нужно его просуммировать и получившуюся сумму записать в доступное количество.
Написал такой обработчик:
use Bitrix\Main\Loader;
use Bitrix\Catalog\Model\Product;
use Bitrix\Catalog\StoreProductTable;
use CIBlockElement;
Loader::includeModule('iblock');
Loader::includeModule('catalog');
class ProductSetQtyAutoUpdate
{
public static function onAfterIBlockElementSetPropertyValuesExHandler($elementId, $iblockId, $propertyValues, $propertyList)
{
if (in_array($iblockId, array(2, 3))) {
$productItem = new CIBlockElement;
// Получаем значения свойств
if (2 == $iblockId) {
$ruNizQty = isset($propertyValues[62]) ? (int)$propertyValues[62] : 0;
$ruPnzQty = isset($propertyValues[63]) ? (int)$propertyValues[63] : 0;
}
if (3 == $iblockId) {
$ruNizQty = isset($propertyValues[70]) ? (int)$propertyValues[70] : 0;
$ruPnzQty = isset($propertyValues[71]) ? (int)$propertyValues[71] : 0;
}
$previewText = isset($propertyValues['IE_PREVIEW_TEXT']) ? html_entity_decode($propertyValues['IE_PREVIEW_TEXT']) : '';
$detailText = isset($propertyValues['IE_DETAIL_TEXT']) ? html_entity_decode($propertyValues['IE_DETAIL_TEXT']) : '';
$totalQty = $ruNizQty + $ruPnzQty;
$arData = array(
"PREVIEW_TEXT_TYPE" => "html",
"PREVIEW_TEXT_TEXT" => $previewText,
"DETAIL_TEXT_TYPE" => "html",
"DETAIL_TEXT_TEXT" => $detailText,
"QUANTITY" => $totalQty,
);
AddMessage2Log(print_r($totalQty, 1), "ProductSetQtyAutoUpdate");
// Обновляем общее количество товара
$productItem->Update($elementId, $arData);
// Обновляем количество товаров для склада с ID 1
self::updateStoreQuantity($elementId, 1, $ruNizQty);
// Обновляем количество товаров для склада с ID 2
self::updateStoreQuantity($elementId, 2, $ruPnzQty);
}
}
}
который висит на событиях
EventManager::getInstance()->AddEventHandler("iblock", "OnAfterIBlockElementSetPropertyValues", array("ProductSetQtyAutoUpdate", "onAfterIBlockElementSetPropertyValuesExHandler"));
EventManager::getInstance()->AddEventHandler("iblock", "OnAfterIBlockElementSetPropertyValuesEx", array("ProductSetQtyAutoUpdate", "onAfterIBlockElementSetPropertyValuesExHandler"));
И количество не обновляется. Описание и краткое описание, при этом, корректно обрабатываются.
В отладке, в переменной $totalQty количество > 0