В общем - проблема такова, что для клиента делали когда-то, видимо на старой версии сайт, у него есть функционал избранного, который работает через AJAX, проблема в том, что для гостей товар в избранном не выводится вообще, в том числе кука favorites не создается вообще.
Что я делаю не так? Я уже что только не перепробовал и менял подход к выводу cookie, serialize менял на json_encode и json_decode - вообще полный глушняк.
Заранее - огромное спасибо тем, что подскажет что тут не так.
/local/ajax/favorites.php
custom.js
component_epilog.php
init.php
index.php (страница Избранное)
Что я делаю не так? Я уже что только не перепробовал и менял подход к выводу cookie, serialize менял на json_encode и json_decode - вообще полный глушняк.
Заранее - огромное спасибо тем, что подскажет что тут не так.
/local/ajax/favorites.php
| Код |
|---|
<?phprequire($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
// Чтобы не выводить лишний HTML:
$APPLICATION->RestartBuffer();
use Bitrix\Main\Application;
use Bitrix\Main\Web\Cookie;
use Bitrix\Main\Context;
global $APPLICATION, $USER;
$application = Application::getInstance();
$context = $application->getContext();
// По умолчанию ничего не изменили
$result = 0;
// Проверяем, пришёл ли ID товара
if (!empty($_GET['id']))
{
$productId = (int)$_GET['id'];
if (!$USER->IsAuthorized()) {
// --- Неавторизованный пользователь ---
// Читаем куку D7-способом
$arElements = unserialize($context->getRequest()->getCookie("favorites"));
if (!is_array($arElements)) {
$arElements = [];
}
// Добавляем или удаляем товар
if (!in_array($productId, $arElements)) {
$arElements[] = $productId;
$result = 1; // Добавили
} else {
$key = array_search($productId, $arElements);
unset($arElements[$key]);
$result = 2; // Удалили
}
// Записываем обратно в куки
$cookie = new Cookie("favorites", serialize($arElements), time() + 60*60*24*60);
// Чтобы кука была доступна во всех разделах сайта:
$cookie->setPath("/");
// Если нужно для всего домена (ogstyle.ru):
// $cookie->setDomain("ogstyle.ru");
// Или используйте getHttpHost():
// $cookie->setDomain($context->getServer()->getHttpHost());
$cookie->setHttpOnly(false);
$context->getResponse()->addCookie($cookie);
} else {
// --- Авторизованный пользователь ---
$idUser = $USER->GetID();
$rsUser = CUser::GetByID($idUser);
if ($arUser = $rsUser->Fetch()) {
$arElements = $arUser['UF_FAVORITES'];
if (!is_array($arElements)) {
$arElements = [];
}
// Добавляем или удаляем товар
if (!in_array($productId, $arElements)) {
$arElements[] = $productId;
$result = 1;
} else {
$key = array_search($productId, $arElements);
unset($arElements[$key]);
$result = 2;
}
// Обновляем поле пользователя
$USER->Update($idUser, ["UF_FAVORITES" => $arElements]);
}
}
}
// Возвращаем JSON-ответ
echo json_encode($result);
die(); |
custom.js
| Код |
|---|
$(document).ready(function() {
/* Favorites */
$('.favourite-btn').on('click', function(e) {
var favorID = $(this).attr('data-item');
if($(this).hasClass('_added')) {
var doAction = 'delete';
} else {
var doAction = 'add';
}
addFavorite(favorID, doAction);
});
/* Favorites */
});
/* Избранное */
function addFavorite(id, action)
{
var param = 'id='+id+"&action="+action;
$.ajax({
url: '/local/ajax/favorites.php', // URL отправки запроса
type: "GET",
dataType: "html",
data: param,
success: function(response) { // Если Данные отправлены успешно
var result = $.parseJSON(response);
if(result == 1){ // Если всё чётко, то выполняем действия, которые показывают, что данные отправлены
$('.favourite-btn[data-item="'+id+'"]').addClass('_added');
var wishCount = parseInt($('.fav-count').html()) + 1;
$('.fav-count').html(wishCount+'+'); // Визуально меняем количество у иконки
}
if(result == 2){
$('.favourite-btn[data-item="'+id+'"]').removeClass('_added');
var wishCount = parseInt($('.fav-count').html()) - 1;
$('.fav-count').html(wishCount+'+'); // Визуально меняем количество у иконки
}
},
error: function(jqXHR, textStatus, errorThrown){ // Если ошибка, то выкладываем печаль в консоль
console.log('Error: '+ errorThrown);
}
});
}
/* Избранное */ |
component_epilog.php
| Код |
|---|
<?phpif(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
use Bitrix\Main\Context;
global $APPLICATION, $USER;
if (!$USER->IsAuthorized()) {
// Гость
$arFavorites = unserialize(Context::getCurrent()->getRequest()->getCookie("favorites"));
} else {
// Авторизован
$idUser = $USER->GetID();
$rsUser = CUser::GetByID($idUser);
$arUser = $rsUser->Fetch();
$arFavorites = $arUser['UF_FAVORITES'];
}
// Приводим к массиву
if (!is_array($arFavorites)) {
$arFavorites = [];
}
// Если есть избранные ID, подсвечиваем «сердечки»
if (count($arFavorites) > 0):
foreach($arFavorites as $favoriteItem): ?>
<sc ript>
if ($('.favourite-btn[data-item="<?=$favoriteItem?>"]')) {
$('.favourite-btn[data-item="<?=$favoriteItem?>"]').addClass('_added');
}
</sc ript>
<?php endforeach;
endif;
?> |
init.php
| Код |
|---|
function favCount() { $application = Application::getInstance();
$context = $application->getContext();
global $USER;
global $APPLICATION;
/* Вывод количества избранного */
if (!$USER->IsAuthorized()) // Для неавторизованного
{
$arElements = unserialize($APPLICATION->get_cookie('favorites'));
if ($arElements == '') {
unset($arElements);
}
foreach ($arElements as $k => $fav) // Checking empty IDs
{
if ($fav == '0') {
unset($arElements[$k]);
}
unset($fav);
}
if (is_array($arElements) && !empty($arElements)) {
$wishCount = count($arElements);
} else {
$wishCount = 0;
}
} else {
$idUser = $USER->GetID();
$rsUser = CUser::GetByID($idUser);
$arUser = $rsUser->Fetch();
foreach ($arUser['UF_FAVORITES'] as $k => $fav) // Checking empty IDs
{
if ($fav == '0') {
unset($arUser['UF_FAVORITES'][$k]);
unset($fav);
}
}
if (is_array($arUser['UF_FAVORITES']) && !empty($arUser['UF_FAVORITES'])) {
$wishCount = count($arUser['UF_FAVORITES']);
} else {
$wishCount = 0;
}
}
return $wishCount;
}
function favId() {
global $USER;
if(!$USER->IsAuthorized()) // Для неавторизованного
{
global $APPLICATION;
$favorites = unserialize(Application::getInstance()->getContext()->getRequest()->getCookie("favorites"));
}
else {
$idUser = $USER->GetID();
$rsUser = CUser::GetByID($idUser);
$arUser = $rsUser->Fetch();
$favorites = $arUser['UF_FAVORITES'];
}
return $favorites;
} |
index.php (страница Избранное)
| Код |
|---|
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Избранное");
$GLOBALS['arrFilter'] = Array("ID" => favId());
?><div class="favourite m-section">
<div class="container">
<h1 class="h2">Избранное</h1>
<? if (is_array(favId()) && count(favId()) > 0): ?>
<?$APPLICATION->IncludeComponent(
"bitrix:catalog.section",
"favorites_section",
Array(
"ACTION_VARIABLE" => "action",
"ADD_PICT_PROP" => "MORE_PHOTO",
"ADD_PROPERTIES_TO_BASKET" => "Y",
"ADD_SECTIONS_CHAIN" => "N",
"ADD_TO_BASKET_ACTION" => "ADD",
"AJAX_MODE" => "N",
"AJAX_OPTION_ADDITIONAL" => "",
"AJAX_OPTION_HISTORY" => "N",
"AJAX_OPTION_JUMP" => "N",
"AJAX_OPTION_STYLE" => "Y",
"BACKGROUND_IMAGE" => "-",
"BASKET_URL" => "/personal/basket.php",
"BROWSER_TITLE" => "-",
"CACHE_FILTER" => "N",
"CACHE_GROUPS" => "Y",
"CACHE_TIME" => "36000000",
"CACHE_TYPE" => "A",
"COMPATIBLE_MODE" => "N",
"CONVERT_CURRENCY" => "N",
"CUSTOM_FILTER" => "{\"CLASS_ID\":\"CondGroup\",\"DATA\":{\"All\":\"AND\",\"True\":\"True\"},\"CHILDREN\":[]}",
"DETAIL_URL" => "",
"DISABLE_INIT_JS_IN_COMPONENT" => "N",
"DISCOUNT_PERCENT_POSITION" => "bottom-right",
"DISPLAY_BOTTOM_PAGER" => "Y",
"DISPLAY_COMPARE" => "N",
"DISPLAY_TOP_PAGER" => "N",
"ELEMENT_SORT_FIELD" => "sort",
"ELEMENT_SORT_FIELD2" => "id",
"ELEMENT_SORT_ORDER" => "asc",
"ELEMENT_SORT_ORDER2" => "desc",
"ENLARGE_PRODUCT" => "STRICT",
"FILTER_NAME" => "arrFilter",
"HIDE_NOT_AVAILABLE" => "N",
"HIDE_NOT_AVAILABLE_OFFERS" => "N",
"IBLOCK_ID" => "4",
"IBLOCK_TYPE" => "catalog",
"INCLUDE_SUBSECTIONS" => "Y",
"LABEL_PROP" => array(),
"LAZY_LOAD" => "N",
"LINE_ELEMENT_COUNT" => "3",
"LOAD_ON_SCROLL" => "N",
"MESSAGE_404" => "",
"MESS_BTN_ADD_TO_BASKET" => "В корзину",
"MESS_BTN_BUY" => "Купить",
"MESS_BTN_DETAIL" => "Подробнее",
"MESS_BTN_LAZY_LOAD" => "Показать ещё",
"MESS_BTN_SUBSCRIBE" => "Подписаться",
"MESS_NOT_AVAILABLE" => "Нет в наличии",
"MESS_NOT_AVAILABLE_SERVICE" => "Недоступно",
"META_DESCRIPTION" => "-",
"META_KEYWORDS" => "-",
"OFFERS_FIELD_CODE" => array("", ""),
"OFFERS_LIMIT" => "5",
"OFFERS_SORT_FIELD" => "sort",
"OFFERS_SORT_FIELD2" => "id",
"OFFERS_SORT_ORDER" => "asc",
"OFFERS_SORT_ORDER2" => "desc",
"OFFER_ADD_PICT_PROP" => "MORE_PHOTO",
"PAGER_BASE_LINK_ENABLE" => "N",
"PAGER_DESC_NUMBERING" => "N",
"PAGER_DESC_NUMBERING_CACHE_TIME" => "36000",
"PAGER_SHOW_ALL" => "N",
"PAGER_SHOW_ALWAYS" => "N",
"PAGER_TEMPLATE" => ".default",
"PAGER_TITLE" => "Товары",
"PAGE_ELEMENT_COUNT" => "18",
"PARTIAL_PRODUCT_PROPERTIES" => "N",
"PRICE_CODE" => array("BASE"),
"PRICE_VAT_INCLUDE" => "Y",
"PRODUCT_BLOCKS_ORDER" => "price,props,sku,quantityLimit,quantity,buttons",
"PRODUCT_DISPLAY_MODE" => "Y",
"PRODUCT_ID_VARIABLE" => "id",
"PRODUCT_PROPS_VARIABLE" => "prop",
"PRODUCT_QUANTITY_VARIABLE" => "quantity",
"PRODUCT_ROW_VARIANTS" => "[{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false},{'VARIANT':'2','BIG_DATA':false}]",
"PRODUCT_SUBSCRIPTION" => "Y",
"PROPERTY_CODE_MOBILE" => array(),
"RCM_PROD_ID" => $_REQUEST["PRODUCT_ID"],
"RCM_TYPE" => "personal",
"SECTION_CODE" => "",
"SECTION_ID" => $_REQUEST["SECTION_ID"],
"SECTION_ID_VARIABLE" => "SECTION_ID",
"SECTION_URL" => "",
"SECTION_USER_FIELDS" => array("", ""),
"SEF_MODE" => "N",
"SET_BROWSER_TITLE" => "Y",
"SET_LAST_MODIFIED" => "N",
"SET_META_DESCRIPTION" => "Y",
"SET_META_KEYWORDS" => "Y",
"SET_STATUS_404" => "Y",
"SET_TITLE" => "Y",
"SHOW_404" => "N",
"SHOW_ALL_WO_SECTION" => "N",
"SHOW_CLOSE_POPUP" => "N",
"SHOW_DISCOUNT_PERCENT" => "Y",
"SHOW_FROM_SECTION" => "N",
"SHOW_MAX_QUANTITY" => "N",
"SHOW_OLD_PRICE" => "Y",
"SHOW_PRICE_COUNT" => "1",
"SHOW_SLIDER" => "Y",
"SLIDER_INTERVAL" => "3000",
"SLIDER_PROGRESS" => "N",
"TEMPLATE_THEME" => "blue",
"USE_ENHANCED_ECOMMERCE" => "N",
"USE_MAIN_ELEMENT_SECTION" => "N",
"USE_PRICE_COUNT" => "N",
"USE_PRODUCT_QUANTITY" => "N"
)
);?>
<? else: ?>
<div class="product-items grid4 grid-laptop3 grid-mob2">
У Вас нет избранных товаров
</div>
<? endif; ?>
</div>
</div><?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?> |