- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/controller/action/entity/changebasketitemaction.php
- Класс: BitrixSaleControllerActionEntityChangeBasketItemAction
- Вызов: ChangeBasketItemAction::changeBasketItem
public function changeBasketItem(array $fields): SaleResult
{
$result = new SaleResult();
$checkParamsResult = $this->checkParams($fields);
if (!$checkParamsResult->isSuccess())
{
$result->addErrors($checkParamsResult->getErrors());
return $result;
}
$basketId = $fields['BASKET_ID'];
$productId = $fields['PRODUCT_ID'];
$fuserId = $fields['FUSER_ID'];
$siteId = $fields['SITE_ID'];
$basket = $this->getBasketByFuserId($fuserId, $siteId);
/** @var SaleBasketItem $currentBasketItem */
$currentBasketItem = $basket->getItemByBasketCode($basketId);
if (!$currentBasketItem)
{
$result->addError(
new MainError(
'basket item load error',
SaleControllerErrorEnumeration::CHANGE_BASKET_ITEM_ACTION_BASKET_ITEM_LOAD
)
);
return $result;
}
$currentOfferId = $currentBasketItem->getProductId();
$parent = CCatalogSku::getProductList($currentOfferId, 0);
if (empty($parent[$currentOfferId]))
{
$result->addError(
new MainError(
'parent product load error',
SaleControllerErrorEnumeration::CHANGE_BASKET_ITEM_ACTION_PARENT_PRODUCT_LOAD
)
);
return $result;
}
$parent = $parent[$currentOfferId];
$offerPropertyCodeList = self::getOfferPropertyCodeList();
$newProduct = self::selectOfferById($parent['IBLOCK_ID'], $parent['ID'], $productId, $offerPropertyCodeList);
if (!$newProduct)
{
$result->addError(
new MainError(
'product load error',
SaleControllerErrorEnumeration::CHANGE_BASKET_ITEM_ACTION_PRODUCT_LOAD
)
);
return $result;
}
$setFieldsResult = $currentBasketItem->setFields([
'PRODUCT_ID' => $newProduct['ID'],
'NAME' => $newProduct['NAME'],
'PRODUCT_XML_ID' => $newProduct['XML_ID'],
]);
if (!$setFieldsResult->isSuccess())
{
foreach ($setFieldsResult->getErrors() as $error)
{
$result->addError(
new MainError(
$error->getMessage(),
SaleControllerErrorEnumeration::CHANGE_BASKET_ITEM_ACTION_SET_FIELD
)
);
}
return $result;
}
$refreshBasketResult = $basket->refresh(
SaleBasketRefreshFactory::createSingle($currentBasketItem->getBasketCode())
);
if (!$refreshBasketResult->isSuccess())
{
foreach ($refreshBasketResult->getErrors() as $error)
{
$result->addError(
new MainError(
$error->getMessage(),
SaleControllerErrorEnumeration::CHANGE_BASKET_ITEM_ACTION_REFRESH_BASKET
)
);
}
return $result;
}
$basketProperties = self::getBasketProperties($parent['IBLOCK_ID'], $newProduct['ID'], $offerPropertyCodeList);
$basketProperties['PRODUCT.XML_ID'] = [
'NAME' => 'Product XML_ID',
'CODE' => 'PRODUCT.XML_ID',
'VALUE' => $currentBasketItem->getField('PRODUCT_XML_ID'),
];
self::setBasketProperties($currentBasketItem, $basketProperties);
$saveBasketResult = $basket->save();
if ($saveBasketResult->isSuccess())
{
$result->setData([
'basket' => $basket,
'basketItem' => $currentBasketItem,
]);
}
else
{
/** @var MainError $error */
foreach ($saveBasketResult->getErrors() as $error)
{
// save basket error
$result->addError(
new MainError(
$error->getMessage(),
SaleControllerErrorEnumeration::CHANGE_BASKET_ITEM_ACTION_SAVE_BASKET
)
);
}
}
return $result;
}