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

Корзина

Внимание! Если корзина привязана к заказу, то использовать метод \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
Наверх