Решение проблемы с работой cookie в init.php в bitrix. Неправильно работают cookie в bitrix в файле init.php
Недавно я работал в куками в bitrix и столкнулся со следующей проблемой — куки создавались, но при обновление слетали, при этом в браузере файлы cookie были записаны, но со значением «null», тип значения строка.
В моей задаче был следующий сценарий:
- В файле init.php я прописал функцию которая делает запрос к БД если куки не созданы. В случае если куки были созданы, то достаём значение из файлов cookie.
- В footer.php, после полной прогрузки страницы, записываются значения в cookie
Для то чтобы мне проверить созданы cookie или нет, мне нужно было в файле init.php получить эти cookie, я прописываю функцию, которая проверяет наличие куки файлов и делает запрос если их нет:
function myFunc() {
/* ПОЛУЧАЕМ КУКИ ФАЙЛЫ ДЛЯ ПРОВЕРКИ */
$request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest()
$infoCookie = $request->getCookie("MY_COOKIE");
if(!$infoCookie) {
/* делаем запрос если куки файлов НЕТ */
}
else {
/* используем куки файлы */
}
}
В файле footer.php я прописываю код на создание куки файлов.
И здесь мы приходим к решению моей проблемы…
Когда я делаю запрос на наличие куки файлов в файле init.php, мне приходит результат что куки файлов нет и одновременно создаются куки файлы со значение null. Поэтому решением данной проблемы будут дополнительная проверка куки файлов в footer.php, перед созданием новых куки.
Там мы будем проверять куки на пустоту и на строковое значение «null» (ИМЕННО СТРОКОВОЕ ЗНАЧЕНИЕ). В случае если значение ровно строке «null» мы так же создаём новые куки.
/* проверяем существуют ли cookie */
$request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();
$infoCookie = $request->getCookie("MY_COOKIE");
$infoCookie = json_decode($infoCookie);
/* создаём куки если их нет или если они ровны "null" */
if(!$infoCookie || $infoCookie != "null") {
/* массив собираем в init.php */
$infoContent = myFunc();
\Bitrix\Main\Context::getCurrent()->getResponse()->addCookie(
new \Bitrix\Main\Web\Cookie("MY_COOKIE", $infoContent)
);
}
Таким образом я решил свою проблему. После второй перезагрузки страницы, у вас должно всё нормально отрабатывать и куки будут записываться как положено.