Этот скрипт добавляет или удаляет товар из «Избранного» в сессии пользователя с поддержкой автоматического переключения состояния (toggle), предотвращением дублирования и возвратом актуального количества товаров в избранном.
Код |
---|
<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
session_start();
global $USER;
$productId = (int)$_REQUEST['product_id'];
$action = $_REQUEST['action'] ?? null; // add, remove или toggle
// Инициализируем сессию для избранного
if (!isset($_SESSION['FAVORITE_PRODUCTS'])) {
$_SESSION['FAVORITE_PRODUCTS'] = [];
}
$favorites = &$_SESSION['FAVORITE_PRODUCTS']; // Ссылка для удобства
$isInFavorite = in_array($productId, $favorites);
// Определяем действие: добавить, удалить или переключить
if ($action === 'add' && !$isInFavorite) {
$favorites[] = $productId;
$status = 'added';
} elseif ($action === 'remove' && $isInFavorite) {
$favorites = array_values(array_filter($favorites, fn($id) => $id != $productId));
$status = 'removed';
} else {
// По умолчанию — переключение (toggle)
if ($isInFavorite) {
$favorites = array_values(array_filter($favorites, fn($id) => $id != $productId));
$status = 'removed';
} else {
$favorites[] = $productId;
$status = 'added';
}
}
// Возвращаем JSON с текущим состоянием
echo json_encode([
'status' => 'success',
'action' => $status,
'in_favorite' => $status === 'added',
'count' => count($favorites)
]);
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/epilog_after.php"); |