@Ekaterina002

Как победить куки через API Битрикс?

Есть код который добавляет в избранное.
Если пользователь авторизован, то в пользователю записываем данные, если не авторизован то в куки.
Что то не пойму что не так с coocies, не пишет.
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle(" ");
$GLOBALS['APPLICATION']->RestartBuffer();
use Bitrix\Main\Application;
use Bitrix\Main\Web\Cookie;
$application = Application::getInstance();
$context = $application->getContext(); 

/* Избранное */
   global $APPLICATION;
   if($_GET['id'])
   {
      if(!$USER->IsAuthorized()) // Для неавторизованного
      {
        $arElements = unserialize($APPLICATION->get_cookie('favorites'));

        if(!in_array($_GET['id'], $arElements))
        {
               $arElements[] = $_GET['id'];
               $result = 1; // Датчик. Добавляем
        }
        else {
            $key = array_search($_GET['id'], $arElements); // Находим элемент, который нужно удалить из избранного
            unset($arElements[$key]);
            $result = 2; // Датчик. Удаляем
        }
		$cookie = new Cookie("favorites", serialize($arElements), time() + 60*60*24*60); $cookie->setDomain($context->getServer()->getHttpHost()); 
		$cookie->setHttpOnly(false);  $context->getResponse()->addCookie($cookie); 
		$context->getResponse()->flush("");
		\Bitrix\Main\Context::getCurrent()->getResponse()->flush('');
        echo json_encode($result);
        die();
//  Ниже код - иконки загораются, и счетчик работает, но переходишь на страницу избранных товаров, а там пусто...
//header('Content-Type: application/x-javascript; charset='.LANG_CHARSET); 
   //     echo \Bitrix\Main\Web\Json::encode($result);
   //     \Bitrix\Main\Application::getInstance()->end();
     //   echo json_encode($result);
       // die();
      }
      else { // Для авторизованного
         $idUser = $USER->GetID();
         $rsUser = CUser::GetByID($idUser);
         $arUser = $rsUser->Fetch();
         $arElements = $arUser['UF_FAVORITES'];  // Достаём избранное пользователя
         if(!in_array($_GET['id'], $arElements)) // Если еще нету этой позиции в избранном
         {
            $arElements[] = $_GET['id'];
            $result = 1;
         }
         else {
            $key = array_search($_GET['id'], $arElements); // Находим элемент, который нужно удалить из избранного
            unset($arElements[$key]);
            $result = 2;
         }
         $USER->Update($idUser, Array("UF_FAVORITES" => $arElements)); // Добавляем элемент в избранное
      }
   }
/* Избранное */ 
echo json_encode($result);
 die(); ?>

<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
  • Вопрос задан
  • 1289 просмотров
Решения вопроса 1
@Ekaterina002 Автор вопроса
Починила:
//сохраняем в Битрикс сессии
$session = \Bitrix\Main\Application::getInstance()->getSession();
//$arElements = unserialize($APPLICATION->get_cookie('favorites'));
$arElements = unserialize($session->get('favorites')/*$APPLICATION->get_cookie('favorites')*/);
if(!in_array($_GET['id'], $arElements))
{
$arElements[] = $_GET['id'];
$result = 1; // Датчик. Добавляем
}
else {
$key = array_search($_GET['id'], $arElements); // Находим элемент, который нужно удалить из избранного
unset($arElements[$key]);

$result = 2; // Датчик. Удаляем
}

$session->set('favorites', serialize($arElements));
/*
$cookie = new Cookie("favorites", serialize($arElements), time() + 60*60*24*60);
$cookie->setDomain($context->getServer()->getHttpHost());
$cookie->setHttpOnly(false);
$context->getResponse()->addCookie($cookie);
$context->getResponse()->flush("");*/

в файле component_epolog.php
if(!$USER->IsAuthorized())
{
$session = \Bitrix\Main\Application::getInstance()->getSession();
$arFavorites = unserialize($session->get('favorites'));
//$arElements = unserialize($APPLICATION->get_cookie('favorites'));
//$arFavorites = unserialize($APPLICATION->get_cookie("favorites"));
//print_r($arFavorites);
}
и аналогично в index.php
if(!$USER->IsAuthorized()) // Для неавторизованного
{
global $APPLICATION;
$session = \Bitrix\Main\Application::getInstance()->getSession();
$favorites = unserialize($session->get('favorites'));
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
art-zhitnik
@art-zhitnik
Разработка приложений Битрикс+Next.js+GraphQL
У вас header и footer подключаются, а надо наверное prolog_before?
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы