Руководство по работе с методами интернет-магазина в Битрикс D7: Корзина

В данной статье мы рассмотрим основные приемы работы с корзиной интернет-магазина на платформе 1С-Битрикс. Мы охватим создание корзины, добавление товаров, изменение позиций, работу с ценами и скидками, а также удаление элементов из корзины.

Корзина в Битрикс D7

Важные замечания

Перед тем как начать работу с методами, стоит обратить внимание на несколько важных моментов:

  1. Запрещено использовать метод `\Bitrix\Sale\Basket::save()` при работе с корзиной, если она привязана к заказу. Это может привести к несанкционированному изменению связанных сущностей (например, оплаты или отгрузки). Вместо этого используйте метод сохранения через заказ: `\Bitrix\Sale\Order::save()`. В ближайших версиях Битрикс будет генерировать предупреждения уровня `E_WARNING`, если будет вызван `\Bitrix\Sale\Basket::save()` при привязке корзины к заказу.

1. Создание корзины

Для создания новой корзины в Битрикс используется метод `\Bitrix\Sale\Basket::create()`, который требует указания ID сайта, к которому будет привязана корзина.


$siteId = 's1'; // ID сайта
$basket = \Bitrix\Sale\Basket::create($siteId);
    

Этот метод создает пустую корзину для указанного сайта.

2. Получение корзины

Корзина может быть получена в двух случаях: когда она привязана к заказу и когда не привязана к заказу.

Корзина, не привязанная к заказу:

Для получения корзины, которая не привязана к заказу, используем метод `loadItemsForFUser()`:


$fuser = 1; // ID пользователя
$siteId = 's1'; // ID сайта
$basket = \Bitrix\Sale\Basket::loadItemsForFUser($fuser, $siteId);
    

Корзина, привязанная к заказу:

Если корзина привязана к заказу, то её можно получить через объект заказа:


$orderId = 123; // ID заказа
$order = \Bitrix\Sale\Order::load($orderId);
$basket = $order->getBasket();
    

3. Получение списка товаров из корзины

Чтобы получить список товаров, можно использовать метод `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);
}
    

4. Получение веса и стоимости корзины

Чтобы получить информацию о весе и стоимости корзины, можно использовать следующие методы:

  • Вес корзины:
  • 
    $basket->getWeight();
            
  • Стоимость корзины (без учета скидок и наценок):
  • 
    $basket->getBasePrice();
            
  • Стоимость с учетом скидок и наценок (если корзина привязана к заказу):
  • 
    $price = $basket->getPrice();
            

Если корзина не привязана к заказу и необходимо учитывать скидки, используйте следующий подход:


$basket = \Bitrix\Sale\Basket::loadItemsForFUser($fuser, $siteId);
$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());
    }
}
    

5. Добавление товара в корзину

Существует несколько вариантов добавления товара в корзину:

Вариант 1:


$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);
    

6. Получение позиции корзины

Позицию корзины можно получить по её ID, коду или индексу.

  • По ID:
  • 
    $basketItem = $basket->getItemById($id);
            
  • По `basketCode`:
  • 
    $basketItem = $basket->getItemByBasketCode($itemCode);
            
  • По индексу:
  • 
    $basketItem = $basket->getItemByIndex($index);
            

7. Изменение позиции корзины

Можно изменять как отдельные поля, так и целые группы полей.

Изменение одного поля:

Если корзина не привязана к заказу:


$basket = \Bitrix\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 = \Bitrix\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();
    

8. Удаление товара из корзины

Удалить товар из корзины можно как при привязке корзины к заказу, так и без неё.

Если корзина привязана к заказу:


$order = \Bitrix\Sale\Order::load(123);
$basket = $order->getBasket();
$basketItem = $basket->getItemById(1);
if ($basketItem) {
    $basketItem->delete();
}
$order->save();
    

Если корзина не привязана к заказу:


$basket = \Bitrix\Sale\Basket::loadItemsForFUser($fuser, SITE_ID);
$basketItem = $basket->getItemById($basketItemId);
$result = $basketItem->delete();
if ($result->isSuccess()) {
    $basket->save();
}
    

Заключение

Работа с корзиной в Битрикс D7 предоставляет множество возможностей для реализации функционала интернет-магазина. Важно помнить о правильном подходе к сохранению данных и работе с заказами. Надеемся, что это руководство поможет вам эффективно использовать методы работы с корзиной и заказами в Битрикс.

Теги:  руководство, D7

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Аутсорсинг

готов помочь, если нет времени

договорная

Могу взять на себя работы по full-stack на основе готовой верстки

* если нет верстки, то возможность верстать с Figma в режиме редактора

Перенос сайтов на «1С-Битрикс»

сайты на платформе «1С-Битрикс» — это удобство, надежность и высокая посещаемость

от 12 000 рублей
Перенос сайтов с любых CMS и статичных страниц на платформу «1С-Битрикс», с учетом дизайна, верстки и урл-адресов. С сохранением всей информации и структуры сайта.

* зависит от объема выполняемых работ.

Лечение сайтов от вирусов

восстановление сайта и подъем версии PHP

от 25 000 рублей
Лечение сайтов на решениях АСПРО и прочих.

* полный комплекс лечения проекта и закрытия дыр