• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/providerbase.php
  • Класс: BitrixSaleProviderBase
  • Вызов: ProviderBase::getProductProviderData
static function getProductProviderData(array $products, $provider, array $data, array $select = array())
{
	$result = array();

	foreach ($products as $productData)
	{
		$productSelect = array_fill_keys($select, true);
		$productId = $productData['PRODUCT_ID'];

		$currentUseOrderProduct = $data['USE_ORDER_PRODUCT'];
		if (isset($productData['IS_NEW']) && $productData['IS_NEW'])
		{
			$currentUseOrderProduct = false;
		}

		$fields = $data;

		if (isset($productData['IS_ORDERABLE']) && $productData['IS_ORDERABLE'])
		{
			$fields['CHECK_COUPONS'] = 'Y';
		}
		else
		{
			$fields['CHECK_COUPONS'] = 'N';
		}

		if (isset($productData['IS_BUNDLE_CHILD']) && $productData['IS_BUNDLE_CHILD'])
		{
			$fields['CHECK_DISCOUNT'] = 'N';
			$fields['CHECK_COUPONS'] = 'N';
		}

		$fields['PRODUCT_ID'] = $productId;

		if (isset($productData['SUBSCRIBE']) && $productData['SUBSCRIBE'] === true)
		{
			unset($productSelect['QUANTITY'], $productSelect['AVAILABLE_QUANTITY']);

			$fields['CHECK_QUANTITY'] = 'N';
			$fields['AVAILABLE_QUANTITY'] = 'N';
		}

		$quantityList = array();

		if (!empty($productData['QUANTITY_LIST']))
		{
			$quantityList = $productData['QUANTITY_LIST'];
		}
		else
		{
			$quantityList[$productData['BASKET_CODE']] = $productData['QUANTITY'];
		}

		$basketId = null;

		if (!empty($productData['BASKET_ID']))
		{
			$basketId = $productData['BASKET_ID'];
		}


		if (intval($basketId) == 0)
		{
			/** @var BasketItem $basketItem */
			$basketItem = $productData['BASKET_ITEM'];
			if ($basketItem)
			{
				$basketId = $basketItem->getId();
			}
		}
//
		if (intval($basketId) > 0)
		{
			$fields['BASKET_ID'] = $basketId;
		}

		$hasTrustData = false;

		$trustData = static::getTrustData($data['SITE_ID'], $productData['MODULE'], $productData['PRODUCT_ID']);
		$resultProductData = array();

		if (static::isReadTrustData() === true
			&& !empty($trustData) && is_array($trustData))
		{
			$hasTrustData = true;
			$resultProductData = $trustData;

			foreach (static::getProductDataRequiredFields() as $requiredField)
			{
				if (!array_key_exists($requiredField, $resultProductData))
				{
					$hasTrustData = false;
					break;
				}
			}


			if ($hasTrustData && isset($productSelect['PRICE']))
			{
				foreach (static::getProductDataRequiredPriceFields() as $requiredField)
				{
					if (!array_key_exists($requiredField, $resultProductData))
					{
						$hasTrustData = false;
						break;
					}
				}
			}
		}

		$itemCode = $productData['PRODUCT_ID'];

		$resultProviderDataList = array();

		if(!$hasTrustData)
		{
			foreach($quantityList as $basketCode => $quantity)
			{
				if (!empty($resultProviderDataList[$quantity]))
				{
					$resultProviderDataList[$quantity]['BASKET_CODE'][] = $basketCode;
					continue;
				}

				$requestFields = $fields;
				$requestFields['QUANTITY'] = $quantity;

				$resultProviderDataList[$quantity] = array(
					'BASKET_CODE' => array($basketCode),
					'DATA' => ($currentUseOrderProduct ? $provider::OrderProduct(
						$requestFields
					) : $provider::GetProductData($requestFields))
				);

			}

		}
		else
		{

			if (!isset($productSelect['AVAILABLE_QUANTITY']) && array_key_exists("AVAILABLE_QUANTITY", $resultProductData))
			{
				unset($resultProductData['AVAILABLE_QUANTITY']);
			}

			$productQuantity = floatval($resultProductData['QUANTITY']);

			$resultProviderDataList[$productQuantity] = array(
				'BASKET_CODE' => array($productData['BASKET_CODE']),
				'DATA' => $resultProductData
			);

		}

		$priceFields = static::getPriceFields();

		foreach ($resultProviderDataList as $quantity => $providerData)
		{
			if (empty($result[$itemCode]))
			{
				$result[$itemCode] = $providerData['DATA'];
			}

			$basketCodeList = $providerData['BASKET_CODE'];

			foreach ($basketCodeList as $basketCode)
			{
				$result[$itemCode]['PRICE_LIST'][$basketCode] = array(
					"ITEM_CODE" => $itemCode,
					"BASKET_CODE" => $basketCode,
				);

				if (isset($providerData['DATA']['QUANTITY']) && $providerData['DATA']['QUANTITY'] > 0)
				{
					$result[$itemCode]['PRICE_LIST'][$basketCode]['QUANTITY'] = $providerData['DATA']['QUANTITY'];
				}

				if (isset($providerData['DATA']['AVAILABLE_QUANTITY']))
				{
					$result[$itemCode]['PRICE_LIST'][$basketCode]['AVAILABLE_QUANTITY'] = $providerData['DATA']['AVAILABLE_QUANTITY'];
				}
			}

			foreach ($priceFields as $fieldName)
			{
				if (isset($providerData['DATA'][$fieldName]))
				{
					foreach ($basketCodeList as $basketCode)
					{
						$result[$itemCode]['PRICE_LIST'][$basketCode][$fieldName] = $providerData['DATA'][$fieldName];
					}
				}
			}
		}

//			$result[$itemCode]['ITEM_CODE'] = $productData['ITEM_CODE'];

		if (isset($productData['IS_BUNDLE_PARENT']) && $productData['IS_BUNDLE_PARENT'])
		{
			$result[$itemCode]["BUNDLE_ITEMS"] = array();
			/** @var array $bundleChildList */
			$bundleChildDataList = static::getBundleChildItemsByProductData($provider, $productData);
			if (!empty($bundleChildDataList) && is_array($bundleChildDataList))
			{
				$quantity = $productData['QUANTITY'] ?? $productData['QUANTITY_LIST'][$basketCode] ?? 0;

				foreach ($bundleChildDataList["ITEMS"] as &$itemData)
				{
					$itemData['QUANTITY'] = $itemData['QUANTITY'] * $quantity;
				}
				unset($itemData);
				$result[$itemCode]["BUNDLE_ITEMS"] = $bundleChildDataList["ITEMS"];
			}
		}
	}

	return $result;
}