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