• Модуль: 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');
}