Нюанс добавления товара в корзину интернет-магазина на Битриксе средствами API заключается в том, что по-умолчанию для реализации опции проверки есть ли товар уже в корзине Битрикс (чтобы не добавлять товар второй раз, а изменить его количество во избежании конфликта с публичным функционалом корзины) используется функция getExistsItem(), для корректной работы которой необходимо помимо ID товара также передать его дополнительные свойства. В данном примере передаются два основных свойства: CATALOG.XML_ID и PRODUCT.XML_ID характерные для базовой реализации большинства интернет-магазинов, но если в вашем магазине используются дополнительные параметры (например: цвет, размер), то их необходимо передать аналогичным образом. Базово код выглядит следующим образом:
if (CModule::IncludeModule("sale")) {
// задаем параметры товара
$item = array(
'productId' => 396, // id товара
'quantity' => 1, // количество
'catalogXmlId' => "8cb106d7-4c66-472a-a2a1-8b94d6b58b2a", // свойство xmlId каталога
'productXmlId' => "136c31c5-9717-11e8-80ef-0050569b5007" // свойство xmlId товара
)
// загружаем текущую корзину пользователя
$basket = Basket::loadItemsForFUser(
Sale\Fuser::getId(),
Context::getCurrent()->getSite()
);
// если в корзине товар есть - меняем количество
if ($basketItem = $basket->getExistsItem('catalog', $item["productId"], [
0 => ['CODE' => 'CATALOG.XML_ID', 'VALUE' => $item["catalogXmlId"]],
1 => ['CODE' => 'PRODUCT.XML_ID', 'VALUE' => $item["productXmlId"]],
])) {
if ((int)$item["quantity"] <= 0) {
$basketItem->delete();
} else {
$basketItem->setField("QUANTITY", $item["quantity"]);
}
// если в корзине товара нет - добавляем
} else {
// добавляем товар
$basketItem = $basket->createItem("catalog", $item["productId"]);
$basketItem->setFields([
"LID" => \Bitrix\Main\Context::getCurrent()->getSite(),
"QUANTITY" => $item["quantity"],
"CATALOG_XML_ID" => $item["catalogXmlId"],
"PRODUCT_XML_ID" => $item["productXmlId"],
]);
// добавляем свойства
$collection = $basketItem->getPropertyCollection();
$prop1 = $collection->createItem();
$prop1->setFields(
[
'NAME' => 'Catalog XML_ID',
'CODE' => 'CATALOG.XML_ID',
'VALUE' => $item["catalogXmlId"]
]
);
$prop2 = $collection->createItem();
$prop2->setFields(
[
'NAME' => 'Product XML_ID',
'CODE' => 'PRODUCT.XML_ID',
'VALUE' => $item["productXmlId"]
]
);
}
// сохраняем корзину с изменениями
$basket->save();
}