Добавление товара или статьи в избранное - это обязательная фишка для интернет-магазина или блога. Однако, в Битрикс по умолчанию нет функционала добавления элемента инфоблока в избранное. Поэтому в данной статье я рассмотрю один из вариантов реализации такого функционала c помощью cookie.
Реализовывать добавление в избранное будем в компоненте catalog.element. Не забудьте скопировать компонент в свое пространство имен. Для начала добавим в шаблон компонента саму ссылку/кнопку добавления в избранное:
Как видите, для ссылки мы задаем обработчик onclick, который вызывает функцию favBtn добавления элемента в избранное, в который передаем ID элемента. Далее, напишем саму функцию favBtn в файле js-скриптов. Можно использовать файл скрипта в верстке, можно использовать файл скрипта самого компонента catalog.element. Только не забудьте скопировать код в минифицированную версию:
function favBtn(pid){
$.post('/addfavorite.php', {PID: pid}, function(data){
alert("Товар добавлен в избранное!")
})
return false
}
Внутри функции мы используем ajax для передачи данных в php-скрипт. А передаем мы идентификатор товара PID, которой в свою очередь передали в функцию. Теперь создадим в корне сайта файл addfavorite.php со следующим содержимым:
require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
global $APPLICATION;
$arFavorits = unserialize($APPLICATION->get_cookie("UF_FAVORITS"));
$arFavorits[] = ['pid' => $_POST['PID']];
$UF_FAVORITS = serialize($arFavorits);
$APPLICATION->set_cookie("UF_FAVORITS", $UF_FAVORITS);
$application = \Bitrix\Main\Application::getInstance();
$context = $application->getContext();
$context->getResponse()->flush('');
Три последние строчки файла должны обязательно присутствовать. Без них куки устанавливаться не будут. Сохранение id избранных элементов производится в куки с ключом UF_FAVORITS. Сначала мы получаем куки с данным ключом, затем преобразуем куки в массив id. Добавляем к массиву id элемента, который хотим добавить в избранное. Затем производим обратный процесс, т.е. преобразуем массив в сериализованную строку и записываем ее в переменную $UF_FAVORITS. И наконец перезаписываем куки с ключем UF_FAVORITS значением переменной $UF_FAVORITS.
Данный способ можно использовать не только на сайтах, работающих на Битрикс, если вместо битриксовых методов работы с cookie использовать стандартный метод php setcookie и супермассив $_COOKIE.
Теперь на любой странице сайта, например, в специально созданном разделе для отображения избранных товаров, разместите компонент catalog.section, если речь идет о избранных товарах. Или компонент news.list, если речь идет о статьях:
$arFavorits = unserialize($APPLICATION->get_cookie("UF_FAVORITS"));
global $favFilter;
$favFilter = array("=ID" => $arFavorits);
$APPLICATION->IncludeComponent(
"bitrix:catalog.section",
"",
array(
"IBLOCK_TYPE_ID" => "catalog",
"IBLOCK_ID" => "5",
"BASKET_URL" => "/personal/cart/",
"COMPONENT_TEMPLATE" => "",
"IBLOCK_TYPE" => "catalog",
"SECTION_ID" => $_REQUEST["SECTION_ID"],
"SECTION_CODE" => "",
"FILTER_NAME" => "favFilter",
...............................................................................
...............................................................................
),
false
);
Сначала получаем массив ID товаров. Потом создаем пользовательский фильтр favFilter, т.е. компонент будет выводить только те товары, ID которых находятся в массиве $favFilter. И название фильтра добавляем в параметр FILTER_NAME массива параметров компонента, только без символа $. На этом все, компонент выведет товары, которые добавили вы добавили в избранное.