Добавление либо удаление элемента инфоблока в избранное при помощи ajax с хранением в cookie

  • Роман Цуканов
    Разработчик
  • Дата публикации
    31.07.2025
  • Категория
    1С-Битрикс
Задача:Добавить, удалить элемент инфоблока в избранное. Отобразить список данных в избранном.

Для того, чтобы добавить элемент в избранное, а также при необходимости удалить его, можно воспользоваться приведенным в стате кодом.

Для начала создадим объект, по которому будем отслеживать клик мышью:

<button data-iblock-id="1" data-element-id="44" class="card-button-fav" type="button">
    Добавить в избранное
</button>

Далее напишем код JS:

function addFavourite(id, iblockId, $this)
{
    var param = 'id='+id+"&iblockId="+iblockId;
    $.ajax({
        url:     '/local/templates/devstages/api/favourites/addToFavourite.php', // URL отправки запроса
        type:     "GET",
        dataType: "html",
        data: param,
        success: function(response) { // Если Данные отправлены успешно
            var result = $.parseJSON(response);
            $($this).toggleClass('active'); // Если необходимо
            if(response == 1){
              $($this).text('В избранном');
            }
            if(response == 2){
                $($this).text('В избранное');
            }
        },
        error: function(jqXHR, textStatus, errorThrown){ // Если ошибка, то выкладываем печаль в консоль
            console.log('Error: '+ errorThrown);
        }
     });
}

$('.card-button-fav').on('click', function(e) {
    let favourId = $(this).data('element-id');
    let iblockId = $(this).data('iblock-id');
    let $this = this;

    if(favourId && iblockId) {
        addFavourite(favourId, iblockId, this);
    }
});

А теперь обработчик на стороне сервера:

<?
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");
$APPLICATION->SetTitle(" ");
$GLOBALS['APPLICATION']->RestartBuffer();

use Bitrix\Main\Application,
    Bitrix\Main\Web\Cookie,
    Bitrix\Main\Context;

global $APPLICATION;
if ($_GET['id']) {

    $iblockId = $_GET['iblockId'];

    switch ($iblockId) {
        case 1:
            $cookieName = 'favoritesFlats';
            break;
        case 7:
            $cookieName = 'favoritesPantries';
            break;
        case 6:
            $cookieName = 'favoritesCommercial';
            break;
        case 4:
            $cookieName = 'favoritesParking';
            break;
    }

    $arElements = unserialize($APPLICATION->get_cookie($cookieName));

    if(empty($arElements)) {
        $arElements[] = $_GET['id'];
        $result = 1; // Датчик. Добавляем
    } else {
        if (!in_array($_GET['id'], $arElements)) {
            $arElements[] = $_GET['id'];
            $result = 1; // Датчик. Добавляем
        } else {
            $key = array_search($_GET['id'], $arElements); // Находим элемент, который нужно удалить из избранного
            unset($arElements[$key]);
            $result = 2; // Датчик. Удаляем
        }
    }
    
    $context = Application::getInstance()->getContext();

    $cookie = new Cookie($cookieName, serialize($arElements), time() + 60 * 60 * 24 * 60);
    $cookie->setDomain($context->getServer()->getServerName());
    $cookie->setHttpOnly(false);
    $cookie->setPath('/');
    $cookie->setSecure(false);

    $response = $context->getResponse();
    $response->addCookie($cookie);

    $response->writeHeaders();

}

/* Избранное */
echo json_encode($result);
die(); ?>

 

Еще нет коммментариев. Будь первым!