G-Web IT. Битрикс-интегратор. Сложный ecommerce и нестандартные интеграции. G-Web IT
Адрес: Летная улица, 30, корпус 1 141021 Мытищи,
Телефон:+7 985 513–06–60, Электронная почта: info@goldwebit.net
По будням с 10:00 до 20
Мы свяжемся с Вами максимально оперативно

G-Web IT

online-заявка

Заявка на услуги

Мы свяжемся с Вами максимально оперативно
||||

Работа с корзиной в Битрикс D7

Начиная с 16 версии используется новая версия ядра магазина Битрикс, являющаяся частью ядра Битрикс D7. Но некоторые классы и методы доступны и в 15 версии магазина (sale, не main). Все классы для работы с магазином собраны в модуле sale, поэтому для работы примером используем use для пространства модуля интернет-магазина.

use Bitrix\Sale;

Корзина (Sale\Basket)

Корзина представляет собой экземпляр класса Bitrix\Sale\Basket.

Корзину можно получить для текущего юзера:

$basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), Bitrix\Main\Context::getCurrent()->getSite());

Или получить корзину заказа:

/** int $orderId номер заказа */
$basket = Sale\Order::load($orderId)->getBasket();
// или:
/** Sale\Basket $order объект заказа */
$basket = Sale\Basket::loadItemsForOrder($order);

Информация о корзине:

$price = $basket->getPrice(); // Сумма с учетом скидок
$fullPrice = $basket->getBasePrice(); // Сумма без учета скидок
$weight = $basket->getWeight(); // Общий вес корзины

Добавление товара в корзину (аналог CSaleBasket::Add), обновление записи и проверка наличия:

/** int $productId ID товара */
/** int $quantity количество */
if ($item = $basket->getExistsItem('catalog', $productId) {
    $item->setField('QUANTITY', $item->getQuantity() + $quantity);
}
else {
    $item = $basket->createItem('catalog', $productId);
    $item->setFields(array(
        'QUANTITY' => $quantity,
        'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(),
        'LID' => \Bitrix\Main\Context::getCurrent()->getSite(),
        'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
    ));
}
$basket->save();

Получение записи по ID и удаление записи из корзины (аналог CSaleBasket::Delete):

/** int $id ID записи */
$basket->getItemById($id)->delete();
$basket->save();

Получение товаров в корзине, доступных для покупки (CAN_BUY=Y):

$orderBasket = $basket->getOrderableItems();

Запись корзины (Sale\BasketItem)

Записи в корзине представляют собой массив объектов класса \Bitrix\Sale\BasketItem:

$basketItems = $basket->getBasketItems(); // массив объектов Sale\BasketItem

Sale\Basket реализует интерфейсы \ArrayAccess, \Countable и \IteratorAggregate, поэтому с объектом корзины можно обращаться как с массивом, получая записи по индексу или перебирая записи с помощью foreach:

foreach ($basket as $basketItem) {
    echo $basketItem->getField('NAME') . ' - ' . $basketItem->getQuantity() . '<br />';
}

Информация о записях:

$item = $basketItems[0];
$item->getId();         // ID записи
$item->getProductId();  // ID товара
$item->getPrice();      // Цена за единицу
$item->getQuantity();   // Количество
$item->getFinalPrice(); // Сумма
$item->getWeight();     // Вес
$item->getField('NAME');// Любое поле записи
$item->canBuy();        // true, если доступно для покупки
$item->isDelay();       // true, если отложено

Также из записи можно получить другие сущности:

$item->getPropertyCollection(); // Свойства записи, массив объектов Sale\BasketPropertyItem
$item->getCollection();         // Корзина, которой принадлежит запись 

Действия над записями:

$item->setField('QUANTITY', $quantity); // Изменение поля
$item->setFields(array(
    'QUANTITY' => $quantity,
    'CUSTOM_PRICE' => $customPrice,
)); // Изменение полей

$item->delete(); // Удаление
$item->save();   // Сохранение изменения, можно использовать и $basket->save();

Таблица корзины (Sale\Internals\BasketTable)

Обращаться напрямую к таблице корзины, без использования объектов можно с использованием ORM-класса Bitrix\Sale\Internals\BasketTable. Например, перебрать товары в корзине текущего пользователя:

$basketIterator = BasketTable::getList(array(
    'filter' => array('=FUSER_ID' => Sale\Fuser::getId(), '=ORDER_ID' => null)
));

while ($basketItem = $basketIterator->fetch()) {
    var_dump($basketItem);
}

Материал статьи взят с https://mrcappuccino.ru/blog/post/work-with-basket-bitrix-d7


Возврат к списку