Этот код добавляет торговое предложение в корзину 1С-Битрикс с увеличением количества при повторном добавлении, корректно обрабатывая цены и валидацию, чтобы избежать ошибок при отсутствии данных.
Код |
---|
<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
use Bitrix\Main\Loader;
use Bitrix\Sale;
use Bitrix\Catalog;
header('Content-Type: application/json');
// :f09f94b4: ВАЖНО: теперь $productId — это ID торгового предложения, например 25
$productId = 125;
$newQuantity = 2;
if ($productId <= 0 || $newQuantity <= 0) {
echo json_encode(["success" => false, "message" => "Некорректные данные"]);
die();
}
if (!Loader::includeModule('sale') || !Loader::includeModule('catalog')) {
echo json_encode(["success" => false, "message" => "Не загружены модули sale или catalog"]);
die();
}
try {
$fUserId = Sale\Fuser::getId();
$siteId = SITE_ID;
$basket = Sale\Basket::loadItemsForFUser($fUserId, $siteId)->getBasket();
// Проверяем, есть ли уже такой товар в корзине
$item = null;
foreach ($basket as $basketItem) {
if ($basketItem->getProductId() == $productId) {
$item = $basketItem;
break;
}
}
// Получаем данные товара
$product = \CIBlockElement::GetByID($productId)->Fetch();
if (!$product) {
echo json_encode(["success" => false, "message" => "Товар не найден"]);
die();
}
// :f09f94b9: Получаем цену по ID торгового предложения
$priceRow = Catalog\PriceTable::getList([
'select' => ['PRICE', 'CURRENCY'],
'filter' => [
'=PRODUCT_ID' => $productId,
'CATALOG_GROUP_ID' => 1 // Основная цена
]
])->fetch();
$price = $priceRow['PRICE'] ?? null;
$currency = $priceRow['CURRENCY'] ?? \Bitrix\Currency\CurrencyManager::getBaseCurrency();
if ($price === null || $price <= 0) {
$price = 1; // Фолбэк для теста
}
if ($item) {
// Увеличиваем количество
$currentQty = $item->getQuantity();
$newQty = $currentQty + $newQuantity;
if ($newQty <= 0) {
throw new Exception("Итоговое количество не может быть <= 0");
}
$item->setField('QUANTITY', $newQty);
} else {
// Создаём новую позицию
$item = $basket->createItem('catalog', $productId);
$item->setFields([
'QUANTITY' => $newQuantity,
'CURRENCY' => $currency,
'LID' => $siteId,
'NAME' => $product['NAME'],
'BASE_PRICE' => $price,
'PRICE' => $price,
'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
]);
}
// :f09f94a5: Критическая проверка: количество > 0
if ($item->getQuantity() <= 0) {
throw new Exception("Количество товара не может быть <= 0. Текущее: " . $item->getQuantity());
}
// Сохраняем
$result = $basket->save();
if (!$result->isSuccess()) {
throw new Exception("Ошибка сохранения корзины: " . implode(", ", $result->getErrorMessages()));
}
echo json_encode([
"success" => true,
"totalQuantity" => $item->getQuantity(),
"message" => "Товар добавлен в корзину"
]);
} catch (Exception $e) {
echo json_encode([
"success" => false,
"message" => "Ошибка: " . $e->getMessage()
]);
}
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/epilog_after.php");
die(); |
[/SIZE][/FONT][/COLOR]