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

Корзина

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

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

    • Вариант 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);
      
    • по внутреннему индексу:
      $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->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());
        	}
        }
        

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

    $basket->refresh();
    

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

    // загружаем заказ
    $order = \Bitrix\Sale\Order::load($ID);
    
    // получаем корзину
    $basket = $order->getBasket();
    
    foreach ($basket as $basketItem)
    {
    	if ((int)$basketItem->getProductId() === 120)
    	{
    		$basketItem->setField('CUSTOM_PRICE', 'Y');
    		$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-2019, «1С-Битрикс», 2019
    Наверх