Битрикс – общая корзина для разных языковых версий

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

Как в Битриксе сделать общую корзину

Предположим что у нас на сайте есть несколько языковых версий лежащих в соответствующих папках /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 файлом.

автор: Dmitriy

З 2011 року займаюся веб-розробкою. Зараз я – PHP Full Stack Developer.
Обговорити ваш проект, а також дізнатися більше про мене ви можете на цьому сайті:
dev.forwww.com

Email: dmitriyribka@gmail.com

Один коментар

  1. Переписал код с использованием 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();
    }

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *