Данный код позволяет добавить в корзину товар вместе со свойствами товара
Добавление товара в корзины начинается с получения сущности самой корзины. Для получения текущей корзины пользователя, нужно воспользоваться кодом:
$basket = \Bitrix\Sale\Basket::loadItemsForFUser( \Bitrix\Sale\Fuser::getId(), \Bitrix\Main\Context::getCurrent()->getSite() ); // массив объектов \Bitrix\Sale\BasketItem $basketItems = $basket->getBasketItems(); $basketItem = $basketItems[0]; //current($basketItems); // Свойства записи, массив объектов Sale\BasketPropertyItem $basketPropertyCollection = $basketItem->getPropertyCollection();
$properties = array(); if(null !== $request->getPost("color") && '' !== $request->getPost("color")){ $properties['COLOR'] = array( 'NAME' => 'Цвет', 'CODE' => 'COLOR', 'VALUE' => $request->getPost("color"), 'SORT' => 100 ); } if(isset($properties)) { $basketPropertyCollection = $item->getPropertyCollection(); $basketPropertyCollection->setProperty($properties); $basketPropertyCollection->save(); }
Имейте ввиду, что элемент корзины на момент добавления свойств должен быть уже сохранен, иначе при сохранении коллекции со свойствами, они будут добавлены к элементу с id=0.
Таким образом, до выполнения функции $basketPropertyCollection->save();
уже должно быть выполнено сохранение корзины
$basket->save()
или выполнено сохранение элемента корзины $basketItem->save()
. Либо, можно не сохранять коллекцию свойств -
тогда она сохранится вместе со всей корзиной.
Таким образом, весь код, добавляющий товар со свойствами в корзину примет вид:
use Bitrix\Sale, Bitrix\Main\Application; $request = Application::getInstance()->getContext()->getRequest(); $basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), Bitrix\Main\Context::getCurrent()->getSite()); $productId = intval($request->getPost("id")); $quantity = intval($request->getPost("quantity")); $properties = array(); if(null !== $request->getPost("color") && '' !== $request->getPost("color")){ $properties['COLOR'] = array( 'NAME' => 'Цвет', 'CODE' => 'COLOR', 'VALUE' => $request->getPost("color"), 'SORT' => 100 ); } if ($item = $basket->getExistsItem('catalog', $productId, $properties)) { $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' => 'CCatalogProductProviderCustom', )); } if(isset($properties)) { $basketPropertyCollection = $item->getPropertyCollection(); $basketPropertyCollection->setProperty($properties); } $basket->save();