@malayamarisha

Каким образом произвести запись ID товара в куки?

Реализован функционал добавления товара в избранное.
Для авторизованных пользователей функционал отрабатывает корректно, а вот для неавторизованного пользователя не передается ID товара.
Пример:
1) заходим в товар
2) кликаем на "Добавить в избранное"
3) ID данного товара должно записываться в куки
4) на странице вывода избранных товаров, ID товара должен подставляться в фильтр

1) В товаре есть "кнопка" для добавления товара в избранное (\bitrix\templates\internet-shop\components\bitrix\catalog.element\.default\template.php)
<div class="put_off favorites old">
                                                <a class="favor" onclick="addFavorite" id="<?= $arResult['ID'] ?>"
                                                   data-item="<?= $arResult['ID'] ?>">Отложить</a>
                                            </div>

2) при клике на кнопку происходит смена фона кнопки, а также отправка ID товара в обработчик (bitrix\templates\internet-shop\components\bitrix\catalog.element\.default\script.js)
function addFavorite(id, action)
{
    var param = 'id='+id+"&action="+action;
    $.ajax({
        url:     '/bitrix/templates/internet-shop/ajax/favorites.php', // URL отправки запроса
        type:     "GET",
        dataType: "html",
        data: param,
        headers: {
            'Cookie': document.cookie
        },
        success: function(response) { // Если Данные отправлены успешно
            //var result = $.parseJSON(response);
            var resultResponse = $.parseJSON(response);
            //if(result == 1)
            if(action == 'add')
            { // Если всё чётко, то выполняем действия, которые показывают, что данные отправлены :)
                $('.favor[data-item="'+id+'"]').addClass('active');
                $('.favorites').addClass('active');
                $('.favor').text('Отложено');
                var wishCount = parseInt($('#want .wishCount').html()) + 1;
                $('#want .wishCount').html(wishCount); // Визуально меняем количество у иконки
                if (wishCount > 0)
                {
                    $('.wishCount').addClass('active');
                }
                console.log(action);
            }
            //if(result == 2)
            if(action == 'delete')
            {
                $('.favor[data-item="'+id+'"]').removeClass('active');
                $('.favorites').removeClass('active');
                $('.favor').text('Отложить');
                var wishCount = parseInt($('#want .wishCount').html()) - 1;
                $('#want .wishCount').html(wishCount); // Визуально меняем количество у иконки
            }
            if (wishCount == '0')
            {
                $('.wishCount').removeClass('active');
            }
        },
        error: function(jqXHR, textStatus, errorThrown){ // Если ошибка, то выкладываем печаль в консоль
            console.log('Error: '+ errorThrown);
        }
    });
}

3) Обработчик данный ID пересылает на страницу /bitrix/templates/internet-shop/ajax/favorites.php
Здесь происходит проверка на авторизацию.
if ($_GET['id'])
{
    if (!$USER->IsAuthorized()) // Для неавторизованного
    {
       $arElements = $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; // Датчик. Удаляем
        }
        $APPLICATION->set_cookie("favorites", serialize($arElements));
    }
    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(); ?>

И в зависимости от авторизации происходит обработка ID товара.
4) Далее ID товара доступен на странице со списком товаров, на котором происходит фильтрация по ID товара.
На данный момент работает только авторизованного пользователя.

Для неавторизованного пользователя не сохраняется ID товара в куки.

Подскажите, пожалуйста, что делаю не так? Спасибо.
  • Вопрос задан
  • 584 просмотра
Решения вопроса 1
smilingcheater
@smilingcheater
Вы уверены, что корректно достаёте значение из куки?
Я вижу, что при сохранении вы сериализуете данные $APPLICATION->set_cookie("favorites", serialize($arElements));
Но когда достаёте обратно не делаете десериализацию $arElements = $APPLICATION->get_cookie('favorites'); и почему-то надеетесь, что вам вернётся массив
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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