Назад

Общая корзина для многосайтовости в Битрикс: решение проблемы

Главная
Блог
Общая корзина для многосайтовости в Битрикс: решение проблемы

Решение проблемы общей корзины в Битрикс при многосайтовости

На проектах с многосайтовостью часто возникает проблема отображения корзины на разных поддоменах или языковых версиях. Рассмотрим эффективное решение этой задачи.

Базовое решение (стандартное API)

Добавьте этот код в init.php:

/*
 * Общая корзина для всех языковых версий
 */
if(CModule::IncludeModule("catalog") && CModule::IncludeModule("sale")){
    $fuserId = CSaleBasket::GetBasketUserID();
    $dbBasketItems = CSaleBasket::GetList(
        array(),
        array(
            "FUSER_ID" => $fuserId,
            "ORDER_ID" => "NULL",
        ),
        false,
        false,
        array('ID', 'DELAY', 'CAN_BUY', 'SET_PARENT_ID', 'TYPE', 'NAME', "PRODUCT_ID", "LID")
    );
    
    $arBasket = array();
    while($b = $dbBasketItems->Fetch()){
        $arBasket[] = $b;
    }
    
    foreach($arBasket as $arProduct){
        $arFields = array(
            "LID" => SITE_ID, // Обновляем привязку к текущему сайту
        );
        CSaleBasket::Update($arProduct["ID"], $arFields);
    }
}

Это решение обеспечивает корректное отображение корзины на всех языковых версиях (/ru/, /en/) и поддоменах.

Решение на D7 (более современный вариант)

if (Loader::includeModule('sale') && Loader::includeModule('catalog')){
    $fuserId = Sale\Fuser::getId();
    $basket = Sale\Basket::loadItemsForFUser($fuserId, ['s1', 'ma']); // Укажите нужные ID сайтов
    
    foreach ($basket as $basketItem) {
        $basketItem->setField('LID', SITE_ID);
    }
    
    $basket->save();
}

Исправление AJAX-добавления товаров при многосайтовости

Частая проблема — добавление товаров работает только для основного сайта. Решение:

  1. Перенесите папку ajax в соответствующие языковые директории (/ru/ajax/, /en/ajax/)

  2. Передавайте SITE_ID в JavaScript:

<div data-site-id="<?=SITE_ID?>"></div>

  1. Используйте значение в AJAX-запросе:

function ajaxCart($thisV) {
    var $id = $thisV.closest('.cart-item').data('id'),
        $cartBlock = $thisV.closest('.cart-items'),
        $count = $thisV.val(),
        $siteID = $('body').data('site-id');

    $cartBlock.addClass('load');
    if ($cartBlock.hasClass('load')){
        $.ajax({
            url: '/'+$siteID+'/ajax/product.php',
            // остальной код
        });
    }
}

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

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