- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/compatible/eventcompatibility.php
- Класс: BitrixSaleCompatibleEventCompatibility
- Вызов: EventCompatibility::onBasketItemBeforeChange
static function onBasketItemBeforeChange(MainEvent $event)
{
if (static::$disableEvent === true)
{
return new MainEventResult( MainEventResult::SUCCESS, null, 'sale');
}
$parameters = $event->getParameters();
/** @var SaleBasketItem $basketItem */
$basketItem = $parameters['ENTITY'];
$isNew = $parameters['IS_NEW'];
$oldValues = $parameters['VALUES'];
if (!$basketItem instanceof SaleBasketItem)
{
return new MainEventResult(
MainEventResult::ERROR,
new SaleResultError(MainLocalizationLoc::getMessage('SALE_EVENT_COMPATIBILITY_WRONG_BASKET'), 'SALE_EVENT_COMPATIBILITY_BASKET_ITEM_BEFORE_CHANGE_WRONG_BASKET'),
'sale'
);
}
$currentBasketFields = BasketCompatibility::convertBasketItemToArray($basketItem);
$basketFields = array();
if ($isNew)
{
$basketFields = $currentBasketFields;
}
else
{
if (!empty($oldValues) && is_array($oldValues))
{
foreach ($oldValues as $oldValueKey => $oldValueData)
{
if (array_key_exists($oldValueKey, $currentBasketFields))
{
$basketFields[$oldValueKey] = $currentBasketFields[$oldValueKey];
}
}
}
}
if (array_key_exists('QUANTITY', $oldValues) && ($currentBasketFields['QUANTITY'] - $oldValues['QUANTITY']) > 0)
{
if (empty($basketFields['ID']) && !empty($currentBasketFields['ID']))
{
$basketFields['ID'] = $currentBasketFields['ID'];
}
$basketFields['QUANTITY'] = $currentBasketFields['QUANTITY'] - $oldValues['QUANTITY'];
static::setDisableEvent(true);
foreach(GetModuleEvents("sale", static::EVENT_COMPATIBILITY_ON_BEFORE_BASKET_ITEM_ADD, true) as $oldEvent)
{
ExecuteModuleEventEx($oldEvent, array(&$basketFields));
}
static::setDisableEvent(false);
$basketFields['QUANTITY'] = $oldValues['QUANTITY'] + $basketFields['QUANTITY'];
}
if (empty($basketFields) && !empty($oldValues) && is_array($oldValues))
{
foreach ($oldValues as $oldValueKey => $oldValueData)
{
if (array_key_exists($oldValueKey, $currentBasketFields))
{
$basketFields[$oldValueKey] = $currentBasketFields[$oldValueKey];
}
}
}
if (!$isNew)
{
static::setDisableEvent(true);
foreach(GetModuleEvents("sale", static::EVENT_COMPATIBILITY_ON_BEFORE_BASKET_ITEM_UPDATE, true) as $oldEvent)
{
ExecuteModuleEventEx($oldEvent, array($basketItem->getId(), &$basketFields));
}
static::setDisableEvent(false);
}
foreach ($currentBasketFields as $key => $value)
{
if (isset($basketFields[$key]) && !is_array($value) && $basketFields[$key] != $value)
{
$basketItem->setFieldNoDemand($key, $basketFields[$key]);
}
}
if (!empty($basketFields['PROPS']) && is_array($basketFields['PROPS']))
{
$propIndexList = array();
/** @var SaleBasketPropertiesCollection $basketPropertyCollection */
if (!$basketPropertyCollection = $basketItem->getPropertyCollection())
{
throw new MainObjectNotFoundException('Entity "BasketPropertiesCollection" not found');
}
$propDiffByName = false;
if (!empty($currentBasketFields['PROPS']) && is_array($currentBasketFields['PROPS']))
{
foreach ($currentBasketFields['PROPS'] as $propData)
{
$propCode = $propData["CODE"];
if (empty($propData["CODE"]))
{
$propCode = $propData["NAME"];
$propDiffByName = true;
}
$propIndexList[$propCode] = $propData;
}
}
foreach ($basketFields['PROPS'] as $propData)
{
$propCode = $propData["CODE"];
if (empty($propData["CODE"]) || $propDiffByName)
$propCode = $propData["NAME"];
if (isset($propIndexList[$propCode]))
{
$propOldData = $propIndexList[$propCode];
if ($propData['SORT'] != $propOldData['SORT'] || $propData['VALUE'] != $propOldData['VALUE'])
{
/** @var SaleBasketPropertyItem $basketPropertyItem */
if ($basketPropertyItem = $basketPropertyCollection->getPropertyItemByValue($propIndexList[$propCode]))
{
$basketPropertyItem->setFieldsNoDemand($propData);
}
}
}
else
{
if ($basketPropertyItem = $basketPropertyCollection->createItem())
{
$basketPropertyItem->setFieldsNoDemand($propData);
}
}
}
}
return new MainEventResult( MainEventResult::SUCCESS, null, 'sale');
}