Начиная с 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);
}