У меня 3 языка (т.е. 3 сайта), один ИБ каталога. На одном домене.
Задача была такой: сделать так, чтобы товары добавленные в одной языковой версии (s1) отображались в корзине другой языковой версии (s2 и/или s3).
Решение вопроса в моем случае многосайтовости оказалось очень простым.
При добавлении товара в корзину он "привязывается" к сайту на котором его добавили - ключ массива LID.
Решение заключается в том, чтобы:
1. при загрузке страницы получить список товаров корзины (без привязки к сайту)
2. поменять значение ключа LID (каким бы оно ни было) на SITE_ID
После этой манипуляции товары корзины текущего пользователя как будто добавлены на текущем сайте.
При смене языковой версии (по сути перехода на другой сайт) снова переписывается LID на SITE_ID.
Код примерно такой (разместить в init.php) :
Проверено с bitrix:sale.basket.basket в рамках одного домена.
Не проверял, но думаю на разных доменах тоже сработает.
Нюанс по скидкам.
Если у товара в рамках одного сайта (s1) применяется скидка, а на другом сайте (s2) на этот же товар скидки нет, то при добавлении товара (смена LID) в корзину второго (s2) сайта скидки уже не будет. При возвращении на первый сайт (s1) скидка снова будет применяться.
s1 (со скидкой):
s2 (скидки нет):
s3 (скидки нет):
Задача была такой: сделать так, чтобы товары добавленные в одной языковой версии (s1) отображались в корзине другой языковой версии (s2 и/или s3).
Решение вопроса в моем случае многосайтовости оказалось очень простым.
При добавлении товара в корзину он "привязывается" к сайту на котором его добавили - ключ массива LID.
Решение заключается в том, чтобы:
1. при загрузке страницы получить список товаров корзины (без привязки к сайту)
2. поменять значение ключа LID (каким бы оно ни было) на SITE_ID
После этой манипуляции товары корзины текущего пользователя как будто добавлены на текущем сайте.
При смене языковой версии (по сути перехода на другой сайт) снова переписывается LID на SITE_ID.
Код примерно такой (разместить в 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);
}
}
|
Не проверял, но думаю на разных доменах тоже сработает.
Нюанс по скидкам.
Если у товара в рамках одного сайта (s1) применяется скидка, а на другом сайте (s2) на этот же товар скидки нет, то при добавлении товара (смена LID) в корзину второго (s2) сайта скидки уже не будет. При возвращении на первый сайт (s1) скидка снова будет применяться.
s1 (со скидкой):
s2 (скидки нет):
s3 (скидки нет):