Решение проблемы общей корзины в Битрикс при многосайтовости
На проектах с многосайтовостью часто возникает проблема отображения корзины на разных поддоменах или языковых версиях. Рассмотрим эффективное решение этой задачи.
Базовое решение (стандартное 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-добавления товаров при многосайтовости
Частая проблема — добавление товаров работает только для основного сайта. Решение:
-
Перенесите папку
ajaxв соответствующие языковые директории (/ru/ajax/, /en/ajax/) -
Передавайте SITE_ID в JavaScript:
<div data-site-id="<?=SITE_ID?>"></div>-
Используйте значение в 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',
// остальной код
});
}
}Эти решения помогут вам реализовать единую корзину для всех сайтов в рамках одного проекта Битрикс, обеспечивая удобство для пользователей и корректную работу системы.