Документация для разработчиков
Темная тема

Корзина

Внимание! Если корзина привязана к заказу, то использовать метод \Bitrix\Sale\Basket::save() для сохранения категорически запрещается. При изменении корзины может произойти изменение связанных сущностей (оплаты, отгрузки), которые не будут сохранены. Необходимо выполнять сохранение через заказ: \Bitrix\Sale\Order::save(). Помимо этого, в одной из ближайших версий вызов \Bitrix\Sale\Basket::save() будет генерировать ошибку уровня E_WARNING.


Создание

$siteId = 's1'; // ID сайта, к которому будет привязана корзина
$basket = \Bitrix\Sale\Basket::create($siteId);

Получение

  • корзина, которая не привязана к заказу:
    /*
     * $fuser – ID пользователя
     * $siteId – ID сайта, к которому привязана корзина
     */
    
    $basket = \Bitrix\Sale\Basket::loadItemsForFUser($fuser, $siteId); 

  • корзина, которая привязана к заказу:
    /*
     * $orderId – id заказа
     */
    $order = \Bitrix\Sale\Order::load($orderId);
    
    $basket = $order->getBasket();

  • получение списка товаров:

    Помимо объектов есть возможность напрямую обращаться к базе через метод \Bitrix\Sale\Basket::getList($parameters).

    Метод всегда возвращает объект Bitrix\Main\DB\Result, из которого можно получить данные с помощью метода fetch().

    Параметр Описание С версии
    $parameters Массив, структура которого полностью соответствует структуре ORM'ного getList.
    // получение списка товаров для текущего пользователя
    $dbRes = \Bitrix\Sale\Basket::getList(
    	[
    		'select' => ['NAME', 'QUANTITY'],
    		'filter' => [
    			'=FUSER_ID' => \Bitrix\Sale\Fuser::getId(), 
    			'=ORDER_ID' => null,
    			'=LID' => \Bitrix\Main\Context::getCurrent()->getSite(),
    			'=CAN_BUY' => 'Y',
    		]
    	]
    );
    
    while ($item = $dbRes->fetch())
    {
    	var_dump($item);
    }

Получение веса

$basket->getWeight();

Получение стоимости

  • без учета скидок и наценок
    $basket->getBasePrice();
  • с учетом скидок и наценок
    • Если корзина привязана к заказу:
      $price = $basket->getPrice();
    • Если корзина не привязана к заказу (применённые скидки не хранятся до тех пор, пока не будет создан заказ):
      /*
       * $fuser – ID пользователя
       * $siteId – ID сайта, к которому привязана корзина
       */
      
      $basket = \Bitrix\Sale\Basket::loadItemsForFUser($fuser, $siteId); // $basket – объект класса \Bitrix\Sale\Basket
      
      $context = new \Bitrix\Sale\Discount\Context\Fuser($basket->getFUserId());
      $discounts = \Bitrix\Sale\Discount::buildFromBasket($basket, $context);
      $r = $discounts->calculate();
      if (!$r->isSuccess())
      {
      	var_dump($r->getErrorMessages());
      }
      
      $result = $r->getData();
      if (isset($result['BASKET_ITEMS']))
      {
      	$r = $basket->applyDiscount($result['BASKET_ITEMS']);
      	if (!$r->isSuccess())
      	{
      		var_dump($r->getErrorMessages());
      	}
      }

Добавление позиции

  • Вариант 1:
    /*
     * $basket – объект класса \Bitrix\Sale\Basket
     */
    
    $basketItem = $basket->createItem($moduleId, $productId);
    $basketItem->setField('QUANTITY', 4);
  • Вариант 2:
    $basketItem = \Bitrix\Sale\BasketItem::create($basket, $moduleId, $productId);
    $basketItem->setField('QUANTITY', 4);
    $basket->addItem($basketItem);

Получение позиции

  • по ID:
    $basketItem = $basket->getItemById($id);
  • по basketCode:
    $basketItem = $basket->getItemByBasketCode($itemCode);

    itemCode – код позиции. Получить код – $basketItem->getBasketCode();.

  • по внутреннему индексу:
    $basketItem = $basket->getItemByIndex($index);

Изменение позиции

Изменить можно как отдельное поле, так и группу полей:


  • Изменение отдельного поля:
    • Если корзина не привязана к заказу:
      $basket = Sale\Basket::loadItemsForFUser($fuser, $siteId);
      
      $basketItem = $basket->getItemById($basketItemId);
      if ($basketItem)
      {
      	$basketItem->setField('FIELD_NAME', $value);
      }
      
      $basket->save();
    • Если корзина привязана к заказу:
      $order = \Bitrix\Sale\Order::load(123);
      $basket = $order->getBasket();
      
      $basketItem = $basket->getItemById(1);
      if ($basketItem)
      {
      	$basketItem->setField('FIELD_NAME', $value);
      }
      
      $order->save();

  • Изменение группы полей:
    • Если корзина не привязана к заказу:
      $basket = Sale\Basket::loadItemsForFUser($fuser, $siteId);
      
      $basketItem = $basket->getItemById($basketItemId);
      if ($basketItem)
      {
      	$basketItem->setFields(
      		[
      			'FIELD_NAME_1' => $value,
      			...
      			'FIELD_NAME_2' => $value,
      		]
      	);
      }
      
      $basket->save();
    • Если корзина привязана к заказу:
      $order = \Bitrix\Sale\Order::load(123);
      $basket = $order->getBasket();
      
      $basketItem = $basket->getItemById(1);
      if ($basketItem)
      {
      	$basketItem->setFields(
      		[
      			'FIELD_NAME_1' => $value,
      			...
      			'FIELD_NAME_2' => $value,
      		]
      	);
      }
      
      $order->save();

Список полей, доступных для изменения:

"NAME", // название товара
"LID", // сайт, на котором сделана покупка
"SORT", // сортировка
"PRODUCT_ID", // код товара
"BASE_PRICE", // цена без учета скидок и наценок
"PRICE", // цена с учетом скидок и наценок
"DISCOUNT_PRICE", // скидка
"CURRENCY", // Валюта
"CUSTOM_PRICE", // флаг(Y/N): кастомная цена или нет
"QUANTITY", // количество
"WEIGHT", // вес
"DIMENSIONS", // размеры
"MEASURE_CODE", // код единицы измерения
"DELAY", // Флаг "товар отложен" (Y/N)
"CAN_BUY", // Флаг "товар можно купить" (Y/N)
"NOTES", // Особые заметки
"VAT_RATE",  // ставка НДС
"VAT_INCLUDED", // флаг(Y/N): включен налог или нет
"BARCODE_MULTI",  // флаг(Y/N): штрихкод уникальный или нет
"SUBSCRIBE", // флаг(Y/N): подписка на товар
"PRODUCT_PROVIDER_CLASS", // Имя класса провайдера
"TYPE", // тип товара
"XML_ID" // внешний идентификатор

Актуализация корзины данными из провайдера

$basket->refresh();

Установка кастомной цены товара

// загружаем заказ
$order = \Bitrix\Sale\Order::load($ID);

// получаем корзину
$basket = $order->getBasket();

foreach ($basket as $basketItem)
{
	if ((int)$basketItem->getProductId() === 120)
	{
		$basketItem->markFieldCustom('PRICE');
		$basketItem->setField('PRICE', 100);
	}
}

$r = $order->save();
if (!$r->isSuccess())
{
	var_dump($r->getErrorMessages());
}

Удаление элемента корзины

  • Если корзина привязана к заказу:
    $order = \Bitrix\Sale\Order::load(123);
    $basket = $order->getBasket();
    
    $basketItem = $basket->getItemById(1);
    if ($basketItem)
    {
    	$basketItem->delete();
    }
    
    $r = $order->save();
    if (!$r->isSuccess())
    {
    	var_dump($r->getErrorMessages());
    }
  • Если корзина не привязана к заказу:
    $basket = Sale\Basket::loadItemsForFUser($fuser, SITE_ID);
    
    $basketItem = $basket->getItemById($basketItemId);
    $result = $basketItem->delete();
    if ($result->isSuccess())
    {
    	$basket->save();
    }


© «Битрикс», 2001-2024, «1С-Битрикс», 2024