У меня 3 языка (т.е. 3 сайта), один ИБ каталога. На одном домене. Задача была такой: сделать так, чтобы товары добавленные в одной языковой версии (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);
}
}
Проверено с bitrix:sale.basket.basket в рамках одного домена. Не проверял, но думаю на разных доменах тоже сработает.
Нюанс по скидкам. Если у товара в рамках одного сайта (s1) применяется скидка, а на другом сайте (s2) на этот же товар скидки нет, то при добавлении товара (смена LID) в корзину второго (s2) сайта скидки уже не будет. При возвращении на первый сайт (s1) скидка снова будет применяться. s1 (со скидкой): http://prntscr.com/n11kpc s2 (скидки нет): http://prntscr.com/n11kzy s3 (скидки нет): http://prntscr.com/n11l9b
Юрий Волошин написал: А причина такого желания, может это решается по-другому и другими средствами. Вот не могу представить ситуацию, когда именно корзина должна стать общей.
Все заказы в общую кучу - да Клиенты с общей авторизацией на всех магазинах - да. Общий инфоблок но разные цены или валюты вывода - да
Можно более подробно цель такой функции.
Прошло 6 лет...
На дворе март 2019. Делается магазин на 3х языках. Товары одинаковые (один ИБ товаров).
Попробуйте передать в параметрах компонента корзины параметр CUSTOM_SITE_ID с ID сайта, корзину которого вам надо отображать, например, s1. У меня сработало, версия 1С-Битрикс: Управление сайтом 18.0.6
Нашел этот параметр, просматривая компонент /bitrix/components/bitrix/sale.basket.basket/class.php, хотя в документации по компоненту такого параметра нет. В компоненте есть такой код
Код
public function onPrepareComponentParams($params)
{
if (isset($params['CUSTOM_SITE_ID']))
{
$this->setSiteId($params['CUSTOM_SITE_ID']);
}
У меня не совсем такая ситуация, но очень схожая. 2 сайта, 2 каталога товаров с доступом для обоих сайтов, т.е. на одном сайте товары из одного каталога, на втором из другого. Оформление заказа происходит на одном сайте. Корзина у меня нужна, по-сути, при переходах между сайтами только маленькая. Поэтому использовал код в init.php ваш, Вадим Буторин. Но в момент оформления товаров скидки с каталога второго сайта не видны. Не знаю куда и копать дальше. Тех. поддержка ответила, что функционала сквозной корзины у них не предусмотрено...
Андрей Турланов написал: У меня не совсем такая ситуация, но очень схожая. 2 сайта, 2 каталога товаров с доступом для обоих сайтов, т.е. на одном сайте товары из одного каталога, на втором из другого. Оформление заказа происходит на одном сайте. Корзина у меня нужна, по-сути, при переходах между сайтами только маленькая. Поэтому использовал код в init.php ваш, Вадим Буторин. Но в момент оформления товаров скидки с каталога второго сайта не видны. Не знаю куда и копать дальше. Тех. поддержка ответила, что функционала сквозной корзины у них не предусмотрено...
Андрей, я полагаю, что вам необходимо дублировать скидку на один товар для 2х сайтов. Т.к. при создании скидки ее можно применить только для 1го сайта.
Чтобы выводить товары в корзине и оформлении заказа со всех сайтов, нужно указать параметр "CUSTOM_SITE_ID" => array('s1','s2','s3'), в bitrix:sale.basket.basket и bitrix:sale.order.ajax во всех сайтах
Для решения данного вопроса без помощи стандартного компонента корзины, достаточно передать не выбранный сайт (\Bitrix\Main\Context::getCurrent()->getSite()) , а массив всех сайтов.