Назад

Битрикс D7 – как добавить товар с произвольной ценой

Главная
Блог
Битрикс D7 – как добавить товар с произвольной ценой

При разработке интернет-магазинов на Битрикс часто возникает необходимость добавить в корзину товар с ценой, отличной от указанной в каталоге. Это может потребоваться для реализации индивидуальных цен, специальных предложений или услуг с гибким ценообразованием.

Основной метод добавления товара с произвольной ценой

Для реализации этой функциональности используем параметр CUSTOM_PRICE = 'Y', который позволяет переопределить стандартную цену товара.

use Bitrix\Main\Context;
use Bitrix\Currency\CurrencyManager;
use Bitrix\Sale;

// Инициализация
$productId = 111; // ID товара
$quantity = 1; // Количество
$customPrice = 123; // Кастомная цена

try {
    // Получаем текущую корзину
    $basket = Sale\Basket::loadItemsForFUser(
        Sale\Fuser::getId(), 
        Context::getCurrent()->getSite()
    );
    
    // Проверяем, есть ли уже такой товар в корзине
    if ($item = $basket->getExistsItem('catalog', $productId)) {
        $item->setField('QUANTITY', $item->getQuantity() + $quantity);
    } else {
        // Создаем новый элемент корзины
        $item = $basket->createItem('catalog', $productId);
        
        // Получаем информацию о товаре для корректного заполнения
        $product = \Bitrix\Catalog\ProductTable::getById($productId)->fetch();
        
        // Устанавливаем параметры товара
        $item->setFields([
            'QUANTITY' => $quantity,
            'CURRENCY' => CurrencyManager::getBaseCurrency(),
            'LID' => Context::getCurrent()->getSite(),
            'PRICE' => $customPrice,
            'CUSTOM_PRICE' => 'Y',
            'NAME' => $product['NAME'] ?? 'Индивидуальное предложение',
            'PRODUCT_PROVIDER_CLASS' => '\Bitrix\Catalog\Product\CatalogProvider',
            'PRODUCT_ID' => $productId,
            'DISCOUNT_PRICE' => 0 // Отключаем скидки для этого товара
        ]);
    }
    
    // Сохраняем изменения
    $result = $basket->save();
    
    if (!$result->isSuccess()) {
        $errors = $result->getErrorMessages();
        // Обработка ошибок сохранения
    }
    
} catch (\Exception $e) {
    // Логирование и обработка исключений
    error_log($e->getMessage());
}

Дополнительные возможности

1. Добавление ссылки на детальную страницу

if (!empty($product['IBLOCK_ID'])) {
    $item->setField('DETAIL_PAGE_URL', 
        \CIBlock::GetArrayByID($product['IBLOCK_ID'], 'DETAIL_PAGE_URL'));
}

2. Учет единиц измерения

if (!empty($product['MEASURE'])) {
    $item->setFields([
        'MEASURE_CODE' => $product['MEASURE'],
        'MEASURE_NAME' => $product['MEASURE_NAME'] ?? 'шт.'
    ]);
}

3. Использование внешних идентификаторов

if (!empty($product['EXTERNAL_ID'])) {
    $item->setField('CATALOG_XML_ID', $product['EXTERNAL_ID']);
}

Альтернативный подход через BasketComponentHelper

Для более простой интеграции можно использовать встроенный хелпер:

\Bitrix\Sale\BasketComponentHelper::addProductToBasket($basket, [
    'PRODUCT_ID' => $productId,
    'QUANTITY' => $quantity,
    'CUSTOM_PRICE' => 'Y',
    'PRICE' => $customPrice,
    'CURRENCY' => CurrencyManager::getBaseCurrency(),
    'PRODUCT_PROVIDER_CLASS' => '\Bitrix\Catalog\Product\CatalogProvider'
]);

Важные замечания

  1. Права доступа: Убедитесь, что текущий пользователь имеет права на добавление товаров в корзину.

  2. Обработка скидок: При установке CUSTOM_PRICE = 'Y' скидки на товар автоматически не применяются.

  3. Валидация данных: Всегда проверяйте входные параметры:

    if (!\Bitrix\Catalog\ProductTable::getById($productId)->fetch()) {
        throw new \Exception('Товар не найден');
    }

  4. Производительность: При массовом добавлении товаров используйте пакетную обработку.

Заключение

Использование API D7 Битрикс для работы с корзиной предоставляет гибкие возможности по управлению товарами и ценами. Представленный подход особенно полезен для реализации нестандартных сценариев работы с корзиной, таких как индивидуальные цены для клиентов или специальные предложения.

Для более сложных интеграций рекомендуется изучить официальную документацию Битрикс и учитывать особенности конкретной конфигурации магазина.











Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Читайте по теме
Все статьи
Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Все статьи