Оглавление
Проблема
Необходимо вывести блок с недавно просмотренными товарами, в кастомизированном шаблоне. Например на странице карточки товара или в на детальной странице новости.Решение
Во первых нужно добавить товар в таблицу просмотренных товаров если он не попадает туда автоматически (в случае использования кастомных компонентов). Для этого файлеelement.php
комплексного компонента каталога добавьте следующий код
//Подключим класс каталога
use \Bitrix\Catalog;
/* тут основное тело файла с вызовом компонента bitrix:catalog.element */
/* тут будет вызван сам компонент недавно просмотренных товаров */
//Запись о просмотренном товаре (код вконце файла)
if(CModule::IncludeModule('sale')){
$skipUserInit = false;
if (!Catalog\Product\Basket::isNotCrawler()){
$skipUserInit = true;
}
//Получим FUSER_ID пользователя
$basketUserId = (int)CSaleBasket::GetBasketUserID($skipUserInit);
if($basketUserId){
//Записываем данные о просмотренном товаре
//$elementId - это ID товара, его возвращает компонент bitrix:catalog.element при подключении
\Bitrix\Catalog\CatalogViewedProductTable::refresh($elementId, $basketUserId);
}
}
Далее можно написать функцию получающую ID недавно просмотренных товаров. Функцию следует добавить в init.php сайта, обычно он лежит в /bitrix/php_interface/init.php или в /local/php_interface/init.php:
/**
* Получить ID просмотренных товаров
* @return array
*/
function getViewedProductsId(){
$skipUserInit = false;
if (!Catalog\Product\Basket::isNotCrawler())
$skipUserInit = true;
$basketUserId = (int)CSaleBasket::GetBasketUserID($skipUserInit);
if ($basketUserId <= 0) {
$basketUserId = [];
}
$viewedProductids = [];
$filter = [
'=FUSER_ID' => $basketUserId,
'=SITE_ID' => SITE_ID
];
$viewedIterator = Catalog\CatalogViewedProductTable::getList([
'select' => ['ELEMENT_ID'],
'filter' => $filter,
'order' => ['DATE_VISIT' => 'DESC'],
'limit' => 12
]);
while ($viewedProduct = $viewedIterator->fetch()) {
$viewedProductids[] = (int)$viewedProduct['ELEMENT_ID'];
}
return $viewedProductids;
}
Функция вернёт массив идентификаторов товаров, которые успел посмотреть пользователь. Параметром limit
мы можем регулировать количество возвращаемых ID.Теперь вернёмся к файлу комплексного компонента element.php, подготовим фильтр и вызовем компонент списка товаров с предустановленным фильтром.
/* тут будет вызван сам компонент недавно просмотренных товаров */
//Недавно просмотренные товары
CModule::includeModule('sale');
$viewedProductids = getViewedProductsId();
if ($viewedProductids)
{
global $viewedProductsFilter;
$viewedProductsFilter = ['ID'=>$viewedProductids];
//Ниже вызываем компонент bitrix:catalog.section
$APPLICATION->IncludeComponent(
'bitrix:catalog.section',
'',
[
//Все параметры стандартные кроме FILTER_NAME - тут должно быть имя переменной
//фильтра которую мы сделали выше
'FILTER_NAME' => 'viewedProductsFilter'
],
$component
);
}
Готово. Теперь при просмотре товара он будет попадать в таблицу просмотренных товаров, а компонент bitrix:catalog.section
.