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