• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/controller/action/entity/updatebasketitemaction.php
  • Класс: BitrixSaleControllerActionEntityUpdateBasketItemAction
  • Вызов: UpdateBasketItemAction::updateBasketItem
public function updateBasketItem(int $id, array $fields): SaleResult
{
	$result = new SaleResult();

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

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

	$basketIterator = $basketClass::getList([
		'select' => ['ORDER_ID', 'FUSER_ID', 'LID'],
		'filter' => [
			'=ID' => $id
		]
	]);

	$fields = $this->prepareBasketFields($fields);

	if ($basketItemData = $basketIterator->fetch())
	{
		if (empty($basketItemData['ORDER_ID']))
		{
			$basket = $this->getBasket($basketItemData['FUSER_ID'], $basketItemData['LID']);
			if ($basket && !$basket->isEmpty())
			{
				$basketItem = $basket->getItemByBasketCode($id);
				foreach ($fields as $fieldName => $fieldValue)
				{
					$setFieldResult = $basketItem->setField($fieldName, $fieldValue);
					if (!$setFieldResult->isSuccess())
					{
						/** @var MainError $error */
						foreach ($setFieldResult->getErrors() as $error)
						{
							$result->addError(
								new MainError(
									$error->getMessage(),
									SaleControllerErrorEnumeration::UPDATE_BASKET_ITEM_ACTION_SET_FIELD
								)
							);
						}
					}
				}

				$checkQuantityResult = $this->checkQuantity($basket);
				if (!$checkQuantityResult->isSuccess())
				{
					foreach ($checkQuantityResult->getErrors() as $error)
					{
						$result->addError(
							new MainError(
								$error->getMessage(),
								SaleControllerErrorEnumeration::UPDATE_BASKET_ITEM_ACTION_CHECK_QUANTITY
							)
						);
					}
				}

				if ($result->isSuccess())
				{
					$saveResult = $basket->save();
					if ($saveResult->isSuccess())
					{
						$result->setData([
							'basket' => $basket,
							'basketItem' => $basketItem,
						]);
					}
					else
					{
						/** @var MainError $error */
						foreach ($saveResult->getErrors() as $error)
						{
							$result->addError(
								new MainError(
									$error->getMessage(),
									SaleControllerErrorEnumeration::UPDATE_BASKET_ITEM_ACTION_SAVE_BASKET
								)
							);
						}
					}
				}
			}
			else
			{
				$result->addError(
					new MainError(
						'basket item load error',
						SaleControllerErrorEnumeration::UPDATE_BASKET_ITEM_ACTION_BASKET_LOAD
					)
				);
			}
		}
		else
		{
			$result->addError(
				new MainError(
					'there is order with this basket item',
					SaleControllerErrorEnumeration::UPDATE_BASKET_ITEM_ACTION_ORDER_EXIST
				)
			);
		}
	}
	else
	{
		$result->addError(
			new MainError(
				'basket item with id '.$id.' is not exists',
				SaleControllerErrorEnumeration::UPDATE_BASKET_ITEM_ACTION_BASKET_ITEM_NOT_EXIST
			)
		);
	}

	return $result;
}