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

Корзина

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