Оглавление
Начиная с 16 версии используется новая версия ядра магазина Битрикс, являющаяся частью ядра Битрикс D7, при этом все классы для работы с интернет-магазином собраны в модуле
sale
, поэтому для работы с примерами в статье используем use
для пространства имён модуля интернет-магазина.
use Bitrix\Sale;
И так, поехали.
Корзина (Sale\Basket)
Корзина представляет собой экземпляр классаBitrix\Sale\Basket
. Чтобы получить корзину текущего пользователя, используйте следующий пример:
$basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), Bitrix\Main\Context::getCurrent()->getSite());
Обратите внимание, что метод getSite()
будет работать только в публичной части сайта. Вы так же можете получить корзину заказа по его идентификатору или через объект заказа:
/** int $orderId номер заказа */
$basket = Sale\Order::load($orderId)->getBasket();
/** Sale\Basket $order объект заказа */
$basket = Sale\Basket::loadItemsForOrder($order);
Получим информацию о корзине
У корзины есть масса полезных методов, для того, чтобы узнать её текущее состояние, например вес корзины, стоимость со скидкой и без, пустая корзина, получить список элементов и многое другое.
$basket->getPrice(); // Цена с учетом скидок
$basket->getBasePrice(); // Цена без учета скидок
$basket->getWeight(); // Общий вес корзины
$basket->getOrderableItems(); //Возвращает актуальную для покупки корзину, отсекая от исходной товары, отложенные или недоступные для покупки.
$basket->getQuantityList(); //Количество товаров в корзине (ключ ID позиции, значение - количество добавленного товара)
$basket->getListOfFormatText(); //Возвращает корзину в читаемом виде, по сути массив строк для простого добавления в письмо о заказе
Добавление товара в корзину
Следующий код добавляет новый элемент в корзину и сохраняет сам объект. Аналог старого метода CSaleBasket::Add ./** входные параметры, можно прислать из ajax формы */
/** 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([
'QUANTITY' => $quantity,
'CURRENCY' => Bitrix\Currency\CurrencyManager::getBaseCurrency(),
'LID' => Bitrix\Main\Context::getCurrent()->getSite(),
'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
]);
}
//Сохраняем корзину
$basket->save();
Если вам необходимо добавить товар в корзину с произвольной ценой, используйте следующий код:/** float $customPrice - произвольная цена */
$item->setFields(array(
'QUANTITY' => $quantity,
'CURRENCY' => Bitrix\Currency\CurrencyManager::getBaseCurrency(),
'LID' => Bitrix\Main\Context::getCurrent()->getSite(),
'PRICE' => $customPrice,
'CUSTOM_PRICE' => 'Y',
));
Обратите внимание что на товары с произвольной ценой система не сможет применить скидки и купоны.Удалить товар из корзины
Для удаления товар из корзины, нам необходимо знать идентификатор записи в корзине (не путать с ID товара в каталоге). Метод представляет из себя аналог CSaleBasket::Delete .
/** int $id ID записи */
$basket->getItemById($id)->delete();
$basket->save();
Товар в корзине (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 />';
}
/* Доступ по индексу */
echo $basket[0]->getField('PRODUCT_PROVIDER_CLASS');
Информацию о товарах корзины можно получить следующими методами
$item = $basket; //Получаем первый элемент корзины по индексу
$item->getId(); // ID записи в корзине
$item->getProductId(); // ID товара
$item->getPrice(); // Цена за единицу
$item->getField('NAME');// Любое поле товара в корзине
$item->canBuy(); // true, если доступно для покупки
$item->isDelay(); // true, если отложено
$item->getQuantity(); // Количество
$item->getFinalPrice(); // Сумма
$item->getWeight(); // Вес
Вы так же можете получить другие сущности корзины используя объект записи:
$item->getPropertyCollection(); // Свойства товара в корзине, коллекция объектов Sale\BasketPropertyItem, см. ниже
$item->getCollection(); // Корзина, в которой лежит товар
Работа с товаром в корзине
Добавление товара в корзину рассмотрено выше, поэтому тут покажу как изменять и удалять товар. Пример изменения поля товара в корзине, например количества:
$item->setField('QUANTITY', $quantity); // Изменение поля
Если нужно изменить несколько полей сразу, передаём массив:
$item->setFields([
'QUANTITY' => $quantity,
'PRICE' => $customPrice
'CUSTOM_PRICE' => 'Y',
]); // Изменение нескольких полей
Удаление записи:
$item->delete(); // Удаление
В конце нужно обязательно сохранить запись или всю корзину:
$item->save();
/* или */
$basket->save();
Свойства товаров в корзине (Sale\BasketPropertiesCollection)
Вышу упоминалось что через запись корзины можно получить другие сущности. Одна из них это коллекция свойств товара, класс Bitrix\Sale\BasketPropertiesCollection. Получается следующим образом:
/** Sale\BasketItem $item объект товара в корзине */
$basketPropertyCollection = $item->getPropertyCollection();
// Далее можем получить массив свойств
$basketPropertyCollection->getPropertyValues();
Если нужно добавить свойство или изменить существующие, используйте следующий пример:
$basketPropertyCollection->setProperty([
[
'NAME' => 'Цвет',
'CODE' => 'COLOR',
'VALUE' => 'Красный',
'SORT' => 100,
],
]);
//Обязательно сохраняем изменения
$basketPropertyCollection->save();
Для удаления свойства, воспользуйтесь методом delete()
:
foreach ($basketPropertyCollection as $propertyItem) {
if ($propertyItem->getField('CODE') == 'COLOR') {
$propertyItem->delete();
break;
}
}
$basketPropertyCollection->save();
Вывод
В целом новое ядро даёт более удобный функционал работы с корзиной. К сожалению не все методы есть в официальной документации, но вы всегда можете воспользоваться конструкцией чтобы получить полный перечень доступных методов.
$basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), Bitrix\Main\Context::getCurrent()->getSite());
var_dump(get_class_methods(get_class($basket))); //Показать методы класса которому принадлежит объект