Редактировать

Вывод ранее просмотренных товаров

Задача

Вывести список ранее просмотренных посетителем сайта товаров.

Решение

Для вывода списка ранее просмотренных товаров у Битрикса есть специально обученный компонент bitrix:catalog.viewed.products.

Пример подключения компонента

<?$APPLICATION->IncludeComponent("bitrix:catalog.viewed.products", "viewed_products", Array(
		"ACTION_VARIABLE" => "action_cvp",	// Название переменной, в которой передается действие
		"ADDITIONAL_PICT_PROP_8" => "MORE_PHOTO",	// Дополнительная картинка
		"ADD_PROPERTIES_TO_BASKET" => "Y",	// Добавлять в корзину свойства товаров и предложений
		"BASKET_URL" => "/cart/",	// URL, ведущий на страницу с корзиной покупателя
		"CACHE_GROUPS" => "Y",	// Учитывать права доступа
		"CACHE_TIME" => "36000000",	// Время кеширования (сек.)
		"CACHE_TYPE" => "A",	// Тип кеширования
		"CART_PROPERTIES_8" => array(	// Свойства для добавления в корзину
			0 => "",
			1 => "",
		),
		"CONVERT_CURRENCY" => "N",	// Показывать цены в одной валюте
		"DEPTH" => "",	// Максимальная отображаемая глубина разделов
		"DETAIL_URL" => "",	// URL, ведущий на страницу с содержимым элемента раздела
		"HIDE_NOT_AVAILABLE" => "N",	// Не отображать товары, которых нет на складах
		"IBLOCK_ID" => IBID_CATALOG,	// Инфоблок
		"IBLOCK_TYPE" => "1c_catalog",	// Тип инфоблока
		"LABEL_PROP_8" => "-",	// Свойство меток товара
		"LINE_ELEMENT_COUNT" => "3",	// Количество элементов, выводимых в одной строке
		"MESS_BTN_BUY" => "Купить",	// Текст кнопки "Купить"
		"MESS_BTN_DETAIL" => "Подробнее",	// Текст кнопки "Подробнее"
		"MESS_BTN_SUBSCRIBE" => "Подписаться",	// Текст кнопки "Уведомить о поступлении"
		"PAGE_ELEMENT_COUNT" => "10",	// Количество элементов на странице
		"PARTIAL_PRODUCT_PROPERTIES" => "N",	// Разрешить частично заполненные свойства
		"PRICE_CODE" => CATALOG_PRICE_CODES,
		"PRICE_VAT_INCLUDE" => "Y",	// Включать НДС в цену
		"PRODUCT_ID_VARIABLE" => "id",	// Название переменной, в которой передается код товара для покупки
		"PRODUCT_PROPS_VARIABLE" => "prop",	// Название переменной, в которой передаются характеристики товара
		"PRODUCT_QUANTITY_VARIABLE" => "",	// Название переменной, в которой передается количество товара
		"PRODUCT_SUBSCRIPTION" => "N",	// Разрешить оповещения для отсутствующих товаров
		"PROPERTY_CODE_8" => array(	// Свойства для отображения
			0 => "",
			1 => "",
		),
		"SECTION_CODE" => "",	// Код раздела
		"SECTION_ELEMENT_CODE" => "",	// Символьный код элемента, для которого будет выбран раздел
		"SECTION_ELEMENT_ID" => "",	// ID элемента, для которого будет выбран раздел
		"SECTION_ID" => "",	// ID раздела
		"SHOW_DISCOUNT_PERCENT" => "Y",	// Показывать процент скидки
		"SHOW_FROM_SECTION" => "N",	// Показывать товары из раздела
		"SHOW_IMAGE" => "Y",	// Показывать изображение
		"SHOW_NAME" => "Y",	// Показывать название
		"SHOW_OLD_PRICE" => "N",	// Показывать старую цену
		"SHOW_PRICE_COUNT" => "1",	// Выводить цены для количества
		"SHOW_PRODUCTS_".IBID_CATALOG => "Y",	// Показывать товары каталога
		"TEMPLATE_THEME" => "blue",	// Цветовая тема
		"USE_PRODUCT_QUANTITY" => "N",	// Разрешить указание количества товара
		"COMPONENT_TEMPLATE" => "viewed_products"
	),
	false
);?>

Но есть нюанс. Это справедливо, если Вы кастомизируете шаблон вывода товара, что бывает не так уж и редко.

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

Для того что бы сообщить битриксу о факте просмотра элемента нужно передать код сайта и код просмотренного товара в скрипт /bitrix/components/bitrix/catalog.element/ajax.php.

Сделать это можно в файле script.js шаблона вывода товара или в любом подключаемом в нем js файле.

Пример передачи информации о посещении страницы

В шаблоне сохраним информацию о коде элемента и сайта, что бы получить ее в скрипте.

<?// данные для обработки через JS?>
<div id="productJSData" data-json='{ "id": "<?=$arResult['ID']?>", "siteId": "<?=SITE_ID?>" }'></div>
<?// / данные для обработки через JS?>

В скрипте получим данные из разметки и сообщим Битриксу о просмотре товара

$(document).ready(function() {
    // прокинем информацию о том, что элемент "просмотрен"
    var jsDataJSON = $("#productJSData").data('json');

    // запрос на добавление элемента в "просмотренные"
    $.ajax({
        url: '/bitrix/components/bitrix/catalog.element/ajax.php',
        method: 'POST',
        data: {
            AJAX: 'Y',
            SITE_ID: jsDataJSON.siteId,
            PRODUCT_ID: jsDataJSON.id,
            PARENT_ID: jsDataJSON.id
        },
        success: function(obj) {
            // some action on success
        },
        error: function(p1,p2,p3) {
            console.log('ERROR',p1,p2,p3);
        }
    });
});