• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/lib/component/base.php
  • Класс: BitrixIblockComponentBase
  • Вызов: Base::addProductToBasket
protected function addProductToBasket($productId, $action)
{
	/** @global CMain $APPLICATION */
	global $APPLICATION;

	$successfulAdd = true;
	$errorMsg = '';

	$quantity = 0;
	$productProperties = array();

	$productId = (int)$productId;
	if ($productId <= 0)
	{
		$errorMsg = Loc::getMessage('CATALOG_PRODUCT_ID_IS_ABSENT');
		$successfulAdd = false;
	}
	$product = [];
	if ($successfulAdd)
	{
		$product = $this->getProductInfo($productId);
		if (empty($product))
		{
			$errorMsg = Loc::getMessage('CATALOG_PRODUCT_NOT_FOUND');
			$successfulAdd = false;
		}
	}
	if ($successfulAdd)
	{
		if ($this->arParams['CHECK_LANDING_PRODUCT_SECTION'])
		{
			[$successfulAdd, $errorMsg] = $this->checkProductSection(
				$productId, $this->arParams['SECTION_ID'], $this->arParams['SECTION_CODE']
			);
		}
	}
	if ($successfulAdd)
	{
		if (!$this->checkProductIblock($product))
		{
			$errorMsg = Loc::getMessage('CATALOG_PRODUCT_NOT_FOUND');
			$successfulAdd = false;
		}
	}
	if ($successfulAdd)
	{
		if ($this->arParams['ADD_PROPERTIES_TO_BASKET'] === 'Y')
		{
			$this->initIblockPropertyFeatures();
			$iblockParams = $this->storage['IBLOCK_PARAMS'][$product['PRODUCT_IBLOCK_ID']];
			if ($product['TYPE'] == CatalogProductTable::TYPE_OFFER)
			{
				$skuAddProps = $this->request->get('basket_props') ?: '';
				if (!empty($iblockParams['OFFERS_CART_PROPERTIES']) || !empty($skuAddProps))
				{
					$productProperties = CIBlockPriceTools::GetOfferProperties(
						$productId,
						$product['PRODUCT_IBLOCK_ID'],
						$iblockParams['OFFERS_CART_PROPERTIES'],
						$skuAddProps
					);
				}
				unset($skuAddProps);
			}
			else
			{
				if (!empty($iblockParams['CART_PROPERTIES']))
				{
					$productPropsVar = $this->request->get($this->arParams['PRODUCT_PROPS_VARIABLE']);
					if (is_array($productPropsVar))
					{
						$productProperties = CIBlockPriceTools::CheckProductProperties(
							$product['PRODUCT_IBLOCK_ID'],
							$productId,
							$iblockParams['CART_PROPERTIES'],
							$productPropsVar,
							$this->arParams['PARTIAL_PRODUCT_PROPERTIES'] === 'Y'
						);
						if (!is_array($productProperties))
						{
							$errorMsg = Loc::getMessage('CATALOG_PARTIAL_BASKET_PROPERTIES_ERROR');
							$successfulAdd = false;
						}
					}
					else
					{
						$errorMsg = Loc::getMessage('CATALOG_EMPTY_BASKET_PROPERTIES_ERROR');
						$successfulAdd = false;
					}
					unset($productPropsVar);
				}
			}
			unset($iblockParams);
		}
	}

	if ($successfulAdd)
	{
		if ($this->arParams['USE_PRODUCT_QUANTITY'])
		{
			$quantity = (float)$this->request->get($this->arParams['PRODUCT_QUANTITY_VARIABLE']);
		}

		if ($quantity <= 0)
		{
			$ratioIterator = CCatalogMeasureRatio::getList(
				array(),
				array('PRODUCT_ID' => $productId),
				false,
				false,
				array('PRODUCT_ID', 'RATIO')
			);
			if ($ratio = $ratioIterator->Fetch())
			{
				$intRatio = (int)$ratio['RATIO'];
				$floatRatio = (float)$ratio['RATIO'];
				$quantity = $floatRatio > $intRatio ? $floatRatio : $intRatio;
			}
		}

		if ($quantity <= 0)
		{
			$quantity = 1;
		}
	}

	if ($successfulAdd)
	{
		$rewriteFields = $this->getRewriteFields($action);
		if (isset($rewriteFields['SUBSCRIBE']) && $rewriteFields['SUBSCRIBE'] == 'Y')
		{
			if (!SubscribeProduct($productId, $rewriteFields, $productProperties))
			{
				if ($ex = $APPLICATION->GetException())
				{
					$errorMsg = $ex->GetString();
				}
				else
				{
					$errorMsg = Loc::getMessage('CATALOG_ERROR2BASKET');
				}

				$successfulAdd = false;
			}
		}
		else
		{
			$product = [
				'PRODUCT_ID' => $productId,
				'QUANTITY' => $quantity
			];
			if (!empty($productProperties))
			{
				$product['PROPS'] = $productProperties;
			}

			$basketResult = CatalogProductBasket::addProduct($product, $rewriteFields, [
				'USE_MERGE' => $this->isMergeProductWhenAddedBasket() ? 'Y' : 'N',
			]);
			if (!$basketResult->isSuccess())
			{
				$errorMsg = implode('; ', $basketResult->getErrorMessages());
				$successfulAdd = false;
			}
			unset($basketResult);
		}
	}

	return array($successfulAdd, $errorMsg);
}