На сайте есть вызываемый по аякс скрипт, который добавляет товар в корзину. Перестал работать. Диагностирую, что из-за CSaleBasket::GetBasketUserID - ставлю вызов несколько раз подряд, отдает каждый раз новое значение. При вызове CSaleBasket::GetBasketUserID(true) отдает 0. Проверяю не в аяксе - работает нормально. Браузер показывает, что POST запрос уходит с куками BX_USER_ID и PHPSESSID стабильно с одинаковыми для каждого вызова аякс. Вызываю в этом аяксовском скрипте \Bitrix\Main\Application::getInstance()->getSession() смотрю SALE_USER_ID - тот, что надо, т.е. тот, который для этого юзера Fuserid в статике. Копаю (дебажу) дальше - вызываю в скрипте Fuser::getSession (временно делаю его public) - в статике отдает объект, в аякс =null Еще дальше - вместо Fuser::getSession вызываю Application::getInstance()->getSession() - все прекрасно, сессия отдается и в статике, и при аякс запросе.
Как такое может быть, что Application::getInstance()->getSession() при вызове внутри Fuser::getSession (https://bxapi.ru/src/?module_id=sale&name=Fuser::getSession) возвращает null, а при вызове не из нее (вместо нее, снаружи) возвращает объект правильно? А, ну и происходит это только в аякс запросе.
Ну, т.е. как подкостылить скрипт понятно - надо не обращаться сразу к CSaleBasket::GetBasketUserID, а пытаться брать сначала SALE_USER_ID прямо из сессии, но непонимание почему вышеописанное имеет место меня сильно беспокоит - почему так?
написал: попробовал getId из \Bitrix\Sale\Fuser вместо CSaleBasket::GetBasketUserID - то же самое
CSaleBasket::GetBasketUserID - обертка вокруг \Bitrix\Sale\Fuser::getId. Null вместо сессии возвращается в случае, когда она блокирована. Покажите свой аякс-файл.
Не надо сверлить зубы через задний проход дрелью от Сваровски
непонятно немного, что именно показывать, т.к. файл, который отвечает на аякс запрос, вызывает компонент, в котором уже добавляется товар в корзину и всякие красивости на фронт отдаются.
У вас после компонента (в конце файла) должно быть или \CMain::FinalActions(); или require_once($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/main/include/epilog_after.php");
Не надо сверлить зубы через задний проход дрелью от Сваровски
понятия не имею, там много культурных слоев в виде разных велосипедов и костылей отложено, трогать страшно. Вынесу на тестовый и поэкспериментирую на досуге дальше, может, добьюсь понимания. Спасибо в любом случае.
Я просто в ступоре в подозрении, что я php не знаю, как это может быть, что берем инстанс внутри Fuser::getSession и берем такой же инстанс снаружи и они разные.
написал: Я просто в ступоре в подозрении, что я php не знаю, как это может быть, что берем инстанс внутри Fuser::getSession и берем такой же инстанс снаружи и они разные.
Цитата
написал: Null вместо сессии возвращается в случае, когда она блокирована
Посмотрите логику метода Fuser::getSession
Не надо сверлить зубы через задний проход дрелью от Сваровски