Начиная с 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))); //Показать методы класса которому принадлежит объект



Полезная статья?
(Голосов: 2, Рейтинг: 3.44)
Курсы от партнёров
Хотите освоить востребованную профессию? Воспользуйтесь предложениями от наших партнёров. Пройдите учебный курс по одному из популярных IT направлений.
Вам также могут понравиться
Создание заказа в 1С Битрикс D7

Создание заказа в 1С Битрикс D7

Рассмотрим пример создания произвольного заказа средствами ядра D7

Объективно о преимуществах и недостатках 1С-Битрикс

Объективно о преимуществах и недостатках 1С-Битрикс

С развитием интернета появилось много платформ, которые помогают начинающим бизнесменам создать и сделать рентабельным и успешным интернет-магазин. Но подобрать действительно эффективную площадку не так-то просто. Что необходимо знать, чтобы не прогореть, какой тип платформы выбрать. Об этом поговорим в этой статье.


Комментарии
Защита от автоматических сообщений
CAPTCHA
Введите слово на картинке