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



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

Все курсы партёнров
Вам также могут понравиться
CSS курсоры

CSS курсоры

В статье рассмотрены возможности изменения курсоров пользователя при помощи CSS

Работа с регистром строк в php

Работа с регистром строк в php

В статье рассмотрены примеры работы с регистром строк в языке PHP, проверка регистра, изменение, инверсия

Работа с циклами в PHP

Работа с циклами в PHP

В статье рассмотрены примеры работы с циклами в PHP


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