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