• Модуль: catalog
  • Путь к файлу: ~/bitrix/modules/catalog/lib/product/basket.php
  • Класс: BitrixCatalogProductBasket
  • Вызов: Basket::addProduct
static function addProduct(array $product, array $basketFields = [], array $options = [])
{
	$result = new MainResult();

	if (empty($product['PRODUCT_ID']))
	{
		$result->addError(new MainError(Loc::getMessage('BX_CATALOG_PRODUCT_BASKET_ERR_NO_PRODUCT')));
		return $result;
	}
	$productId = (int)$product['PRODUCT_ID'];
	if ($productId <= 0)
	{
		$result->addError(new MainError(MainLocalizationLoc::getMessage('BX_CATALOG_PRODUCT_BASKET_ERR_NO_PRODUCT')));
		return $result;
	}

	$product['MODULE'] = 'catalog';
	$product['PRODUCT_PROVIDER_CLASS'] = self::getDefaultProviderName();

	if (!empty($basketFields))
		$product = array_merge($product, $basketFields);

	if (self::$saleIncluded === null)
		self::$saleIncluded = Loader::includeModule('sale');

	if (!self::$saleIncluded)
	{
		$result->addError(new MainError(Loc::getMessage('BX_CATALOG_PRODUCT_BASKET_ERR_NO_SALE')));
		return $result;
	}

	$siteId = SITE_ID;
	if (!empty($basketFields['LID']))
		$siteId = $basketFields['LID'];

	$context = array(
		'SITE_ID' => $siteId,
	);

	$registry = SaleRegistry::getInstance(SaleRegistry::REGISTRY_TYPE_ORDER);

	/** @var SaleBasket $basketClass */
	$basketClass = $registry->getBasketClassName();

	$basket = $basketClass::loadItemsForFUser(SaleFuser::getId(), $siteId);

	$options['CHECK_PERMISSIONS'] = 'Y';
	$options['USE_MERGE'] = (isset($options['USE_MERGE']) && $options['USE_MERGE'] == 'N' ? 'N' : 'Y');
	$options['CHECK_CRAWLERS'] = 'Y';

	$result = static::add($basket, $product, $context, $options);

	if ($result->isSuccess())
	{
		$saveResult = $basket->save();
		if ($saveResult->isSuccess())
		{
			$resultData = $result->getData();
			if (!empty($resultData['BASKET_ITEM']))
			{
				$item = $resultData['BASKET_ITEM'];
				if ($item instanceof SaleBasketItemBase)
				{
					if (self::$statisticIncluded === null)
						self::$statisticIncluded = MainLoader::includeModule('statistic');

					if (self::$statisticIncluded)
					{
						CStatistic::Set_Event(
							'sale2basket', 'catalog', $item->getField('DETAIL_PAGE_URL')
						);
					}
					$result->setData(array(
						'ID' => $item->getId()
					));
				}
				else
				{
					$result->addError(new MainError(Loc::getMessage('BX_CATALOG_PRODUCT_BASKET_ERR_UNKNOWN')));
				}
				unset($item);
			}
			else
			{
				$result->addError(new MainError(Loc::getMessage('BX_CATALOG_PRODUCT_BASKET_ERR_UNKNOWN')));
			}
			unset($resultData);
		}
		else
		{
			$result->addErrors($saveResult->getErrors());
		}
		unset($saveResult);
	}
	unset($basket, $context, $siteId);

	return $result;
}