Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

В корзину добавляется страница сайта.

00 голосов
6
Приветствую.
Подскажите, как можно решить данную проблему?
Добавляем товар в корзину. Товар улетает вверх, а в корзине появляется та страница сайта, с которой добавляется товар.
Компонент корзины bitrix:sale.basket.basket.linе.
спросил 16 Окт, 13 от xeOoN (120 баллов)

6 Ответы

00 голосов
Аналогичная проблема, пока не знаю как лечить.
Также такое поведение возникает если в обработчике корзины отменить добавление товара в корзину или в шаблоне сделать ссылки на добавление товара и например изменить действие добавления на неправильное.
ответил 06 Ноя, 13 от Chil (100 баллов)
00 голосов
Как я понял, проблема в скрипте script.js и логике работы компонента, например рассмотри на основе catalog.section. 
вот кусок script.js кода
Код
 $.get(
   element.href + "&ajax_buy=1",
   $.proxy(
      function(data) {
         ...
         $("#cart_line").html(data);
         ...
      }
   )
);
проблема в переменной data. В нашем случае в неё приходит весь html код страницы, а должен придти только html с информацией по корзине. Идем дальше. В модуле catalog.section находим кусок кода:

Код
$strError = "";
if (array_key_exists($arParams["ACTION_VARIABLE"], $_REQUEST) && array_key_exists($arParams["PRODUCT_ID_VARIABLE"], $_REQUEST))
{
...
if(($action == "ADD2BASKET" || $action == "BUY" && $productID > 0) {
 ...
   if(!$strError && Add2BasketByProductID($productID, $QUANTITY, $product_properties))
      {
         if($action == "BUY")
            LocalRedirect($arParams["BASKET_URL"]);
               else
            LocalRedirect($APPLICATION->GetCurPageParam("", array($arParams["PRODUCT_ID_VARIABL
      }
      else
      {
      ...   
      }

}
// Line
}
 
Заметим, что если все идет штатным образом (нет ошибок при добавлении, добавление прошло и его например не отменили в обработчике и т.п.) то у нас корзина показывается корректно. Т.е все дело в функции LocalRedirect(). Видимо нужно обязательно делать редирект, для корректной перерисовки корзины, именно тогда в script.js придет корректная data. Поэтому добавим в конец условия if после комментария //Line 1 вызов  LocalRedirect(). В итоге получим:

Код
if (array_key_exists($arParams["ACTION_VARIABLE"], $_REQUEST) && array_key_exists($arParams["PRODUCT_ID_VARIABLE"], $_REQUEST))
{
...
// Line
 LocalRedirect($APPLICATION->GetCurPageParam("", array($arParams["PRODUCT_ID_VARIABLE"], $arParams["ACTION_VARIABLE"])));
}

теперь все работает. Остался вопрос для разработчиков - правильно ли была устранена проблема и почему такие вещи, которые уже обсуждали ранее на форуме (например Ранее на форуме) не поправлена в релизе 11, ведь проблема существенная и её легко повторить в демо версии?
ответил 13 Фев, 14 от Juliechis (100 баллов)
00 голосов
Хорошая диагностика! Сейчас попробую.
Просто ранее такого не наблюдалось и все добавлялось корректно. После чего это произошло трудно сказать. Возможно после обновления...
ответил 03 Июнь, 14 от xeOoN (120 баллов)
00 голосов
Проблема осталась :(
ответил 30 Сен, 14 от xeOoN (120 баллов)
00 голосов
Я тестировал на штатном шаблоне, который идет с демо версией сайта. Вы используете штатный или самодельный шаблон ? Если штатный, то скажите его название. В текущем шаблоне, в корзину хоть когда-нибудь добавлялся товар нормально, чтобы показывалась не страница сайта ? Попробуйте сделать шаблон для каталога .default и включить опцию AJAX, я тестировал на этом шаблоне.
ответил 02 Фев, 15 от Juliechis (100 баллов)
00 голосов
В 10й версии разбирал детально механизм работы ajax-добавления в корзину в демо-шаблоне, не думаю что сейчас многое изменилось.
Как оно работает:
1. при клике на ссылку "добавить" аяксом вызывается страница добавления товара в корзину с доп. параметром "&ajax_buy=1"
2. страница догружается до компонента sale.basket.basket.line, у него есть component_epilog.php с таким текстом
Код
   function BasketLineAjaxResponse()
   {
      global $APPLICATION;
      $APPLICATION->RestartBuffer();
      $APPLICATION->IncludeComponent("bitrix:sale.basket.basket.line", ".default", $GLOBALS['BASKET_RESPONSE_AJAX_PARAMS'], false, array('HIDE_ICONS' => 'Y'));

      die();
   }

   AddEventHandler('main', 'OnBeforeLocalRedirect', 'BasketLineAjaxResponse');
Буквально - при наличии в запросе ajax_buy=1, перед вызовом функции LocalRedirect (а она как раз вызывается после процесса добавления в корзину в компоненте catalog.detail, catalog.section и т.д.) все что загрузилось до текущего момента сбрасывается, подключается компонент  basket.line и выполнение страницы завершается. Соответственно вызывающему скрипту возвращается html-код только корзины.
Исходя из этой логики полная страница появится в корзине если компонент   sale.basket.basket.line подключить после компонента catalog или catalog.detail, потому что LocalRedirect отрабатывает раньше чем устанавливается обработчик OnBeforeLocalRedirect
ответил 16 Май, 15 от Ahbar (820 баллов)

Похожие вопросы

0 голосов
3 ответов
спросил 04 Апр, 14 от deify (100 баллов)
0 голосов
0 ответов
спросил 21 Март, 14 от NiKa (100 баллов)
0 голосов
4 ответов
спросил 10 Янв, 14 от Felisa4ka (120 баллов)
0 голосов
1 ответ
спросил 12 Май, 13 от Revolutio (120 баллов)
0 голосов
1 ответ