Данный код решает проблему на проектах разработанных по принципу многосайтовости и позволяет отображать товары в корзине на любом поддомене.
Как в Битриксе сделать общую корзину
Предположим что у нас на сайте есть несколько языковых версий лежащих в соответствующих папках /ru/ и /en/. А кроме этого, созданы отдельные сайты. Шаблон в таком случае может быть общий. Чуть позже поделюсь с вами как решить проблему с AJAX добавлением, т.к. там тоже не всё так очевидно.
Добавим этот код в init.php:
/* * Общая корзина для всех языковых версий */ if(CModule::IncludeModule("catalog") && CModule::IncludeModule("sale")){ $fuserId = CSaleBasket::GetBasketUserID(); $dbBasketItems = CSaleBasket::GetList( array(), array( "FUSER_ID" => $fuserId, //"LID" => SITE_ID, // это нам не надо "ORDER_ID" => "NULL", //"ID" => $id, // это тоже не надо ), 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); } }
Вы уже могли видеть этот код на официальном форуме, откуда он и был позаимствован :). Скорей всего есть решение покрасивее, но со своей задачей справляется отлично. Теперь корзина одинаково хорошо работает на всех языковых версиях.
В моем случае не работало добавление товара в корзину, она добавлялась к основному сайту, и не отображалась на языковом поддомене.
Как в Битриксе исправить AJAX добавление при многосайтовости
Если у вас папка ajax лежит в шаблоне как и у меня, то файл определяет SITE_ID как s1. А SITE_ID – это константа, и значит ее нельзя переопределить. Что же делать и как заставить битрикс увидеть наш SITE_ID.
Всё довольно просто – эту папку нужно перенести соответственно в /ru/ и в /en/. Таким образом константа будет подхватываться верно, и останется только в скрипте передавать это значение.
Как вариант, можно сделать так:
..data-site-id=”<?=SITE_ID?>” ..
и в скрипте забирать её:
.. // ajax cart 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', ..
$siteID – папка с нашим ajax файлом.
Переписал код с использованием D7:
if (Loader::includeModule(‘sale’) && Loader::includeModule(‘catalog’)){
$fuserId = Sale\Fuser::getId();
$basket = Sale\Basket::loadItemsForFUser($fuserId, [‘s1’, ‘ma’]);
foreach ($basket as $basketItem) {
$basketItem->setField(‘LID’, SITE_ID);
}
$basket->save();
}