• Модуль: catalog
  • Путь к файлу: ~/bitrix/modules/catalog/lib/discount/discountmanager.php
  • Класс: BitrixCatalogDiscountDiscountManager
  • Вызов: DiscountManager::extendOrderData
static function extendOrderData(MainEvent $event): MainEventResult
{
	$process = true;
	$resultData = [];
	$orderData = $event->getParameter('ORDER');
	$entityList = $event->getParameter('ENTITY');
	$cacheKeyForEntityList = self::getCacheKeyForEntityList($entityList);

	if (empty($orderData) || !is_array($orderData))
	{
		$process = false;
	}
	else
	{
		if (!isset($orderData['BASKET_ITEMS']) || !is_array($orderData['BASKET_ITEMS']))
			$process = false;
	}

	$entityData = false;
	$iblockData = false;
	if (
		$process
		&& !empty($orderData['BASKET_ITEMS'])
	)
	{
		$entityData = self::prepareEntity($entityList);
		if (empty($entityData))
			$process = false;
	}
	if ($process)
	{
		$productMap = [];
		$productList = [];
		$productData = [];
		$priceList = [];

		$basket = array_filter($orderData['BASKET_ITEMS'], 'BitrixCatalogDiscountDiscountManager::basketFilter');
		if (!empty($basket))
		{
			foreach ($basket as $basketCode => $basketItem)
			{
				$basketItem['PRODUCT_ID'] = (int)$basketItem['PRODUCT_ID'];
				$productList[] = $basketItem['PRODUCT_ID'];
				if (!isset($productMap[$basketItem['PRODUCT_ID']]))
				{
					$productMap[$basketItem['PRODUCT_ID']] = [];
				}
				$productMap[$basketItem['PRODUCT_ID']][] = &$basket[$basketCode];

				if (isset($basketItem['PRODUCT_PRICE_ID']))
				{
					$priceList[] = $basketItem['PRODUCT_PRICE_ID'];
				}
			}
			unset($basketItem, $basketCode);

			if(isset(self::$preloadedProductsData[$cacheKeyForEntityList]))
			{
				$preloadedProductIds = array_keys(self::$preloadedProductsData[$cacheKeyForEntityList]);
				$loadedProductIds = array_intersect($productList, $preloadedProductIds);

				$productList = array_diff($productList, $preloadedProductIds);
			}

			$productData = array_fill_keys($productList, []);

			if($productData)
			{
				$iblockData = self::getProductIblocks($productList);
				self::fillProductPropertyList($entityData, $iblockData);
				self::fillProductPriceList($entityData, $priceList);
			}
		}

		if (!empty($iblockData['iblockElement']))
		{
			self::getProductData($productData, $entityData, $iblockData);
		}

		if(!empty($loadedProductIds))
		{
			foreach($loadedProductIds as $loadedProductId)
			{
				$productData[$loadedProductId] = self::$preloadedProductsData[$cacheKeyForEntityList][$loadedProductId];
			}

			if(!empty($entityData['priceFields']))
			{
				self::fillByPreloadedPrices($productData, $priceList);
			}
		}

		if($productData)
		{
			foreach ($productData as $product => $data)
			{
				if (empty($productMap[$product]))
					continue;
				foreach ($productMap[$product] as &$basketItem)
					$basketItem['CATALOG'] = $data;
				unset($basketItem);
			}
			unset($product, $data);

			$resultData['BASKET_ITEMS'] = $basket;
		}
		unset($basket, $productData, $productMap, $productList);
	}

	if ($process)
		$result = new MainEventResult(MainEventResult::SUCCESS, $resultData, 'catalog');
	else
		$result = new MainEventResult(MainEventResult::ERROR, null, 'catalog');
	unset($process, $resultData);

	return $result;
}