В корзине bitrix использую самописный ajax api на CSaleBasket::Update через который не всегда обновляется колличество товаров. Кеш?

Аналогичный вопрос задавался по ссылке Не обновляется корзина методом CSaleBasket::Update на 1c bitrix? при этом не увидел ответа на него.
Более детализирую происходящее:

Используется самописный JS на стандартном компоненте корзины. Обновление идёт по Ajax

Вот функция которая его выполняет:

function productUpdateInBasket($PRODUCT_ID=0,$QUANTITY=0) {
//// Выполняем запрос в корзину узнаём есть ли у неё элемент с Ид_товара
$a = CSaleBasket::GetList(// Выполняем запрос в корзину узнаём есть ли у неё элемент с Ид_товара
$arOrder = array(),
$arFilter = array("PRODUCT_ID"=>$PRODUCT_ID),
$arGroupBy = false,
$arNavStartParams = false,
$arSelectFields = array()
);
if (count($a->arResult)) {// Если есть получаем Ид этого элемента в корзине(может не совпадать с Ид товара)
$idProductInBasket = $a->arResult[0]["ID"];
$arFields_new = array("QUANTITY"=>$QUANTITY);
return CSaleBasket::Update($idProductInBasket, $arFields_new);
}
return false;
}

Иногда переставали обновляться некоторые товары, то есть вообще всё работает. Но иногда у какого нибудь товара добавленного из каталога в корзине перестаёт обновляться количество через ajax на указанную функцию.

Причём перестаёт обновляться как это видно в стандартном компоненте так и в шапке информация в которой запрашивается через

CSaleBasket::GetList(//Выполняем запрос
array("NAME" => "ASC","ID" => "ASC"),
array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL"),
false,
false,
array("ID","MODULE","PRODUCT_ID","QUANTITY","CAN_BUY","PRICE"));

Ситуация исправляется если нажимать удалить товар и заново его добавить.
Причём кнопку удалить нужно нажать 2-3 раза и только после этого товар удаляется.

Для удаления используется

function productDeleteFromBasket($PRODUCT_ID=0) {
//// Выполняем запрос в корзину узнаём есть ли у неё элемент с Ид_товара
$a = CSaleBasket::GetList(// Выполняем запрос в корзину узнаём есть ли у неё элемент с Ид_товара
$arOrder = array(),
$arFilter = array("PRODUCT_ID"=>$PRODUCT_ID),
$arGroupBy = false,
$arNavStartParams = false,
$arSelectFields = array()
);
if (count($a->arResult)) {// Если есть получаем Ид этого элемента в корзине(может не совпадать с Ид товара)
$idProductInBasket = $a->arResult[0]["ID"];
$arFields_new = array("QUANTITY"=>0);
return CSaleBasket::Update($idProductInBasket, $arFields_new);
}
return false;
}

Что это? Кеширование? Можно ли как то CSaleBasket заставить принудительно его обновить?

Даже когда количество не обновляется return CSaleBasket::Update($idProductInBasket, $arFields_new); у метода возвращает положительный результат без ошибок.
  • Вопрос задан
  • 756 просмотров
Решения вопроса 1
nikolaevevge
@nikolaevevge Автор вопроса
Заменил код функции следующим:
function productUpdateInBasket($prodId=0,$QUANTITY=0) {
    if ($prodId == 0) {return false;}
      $basket = \Bitrix\Sale\Basket::loadItemsForFUser(\Bitrix\Sale\Fuser::getId(CSaleBasket::GetBasketUserID()), \Bitrix\Main\Context::getCurrent()->getSite());
      $basket->refresh();

      $dbRes = \Bitrix\Sale\Basket::getList(array(
        "select"=>["PRODUCT_ID","NAME","QUANTITY","ID"],
        "filter"=>array(
        "=FUSER_ID"=>\Bitrix\Sale\Fuser::getId(),
        "=ORDER_ID" => null,
        "=LID"=>\Bitrix\Main\Context::getCurrent()->getSite(),
        "=CAN_BUY"=>"Y",
        "=PRODUCT_ID"=>$prodId
      )
    ));

    $itemId = false;

    while ($item = $dbRes->fetch()) {
      if (isset($item["ID"]) and $item["ID"] and isset($item["PRODUCT_ID"]) and ($item["PRODUCT_ID"] == $prodId)) {
        $itemId = $item["ID"];
      }
    }

    if ($itemId) {
      $itemProd = $basket->getItemById($itemId);
      if ($QUANTITY==0) {
        $itemProd->delete();
      } else {
        $itemProd->setField("QUANTITY",$QUANTITY);
      }
      $basket->save();
      $basket->refresh();
      return true;
   }
  return false;
}

Так ещё инфа с примерами кода по ситуации тут blog.ivru.net/?id=51
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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