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

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *