Оглавление

Проблема

Необходимо вывести блок с недавно просмотренными товарами, в кастомизированном шаблоне. Например на странице карточки товара или в на детальной странице новости.

Решение

Во первых нужно добавить товар в таблицу просмотренных товаров если он не попадает туда автоматически (в случае использования кастомных компонентов). Для этого файле 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.
Другие решения
Скачать изображение средствами CURL PHP

Скачать изображение средствами CURL PHP

Как загрузить файл изображения по имеющейся в распоряжении ссылке (URL), при этом проверить его на допустимое разрешение (размер) и вес и mime-тип.

Публикация записей с сайта в Telegram-канал

Публикация записей с сайта в Telegram-канал

Как автоматически публиковать посты в телеграм канал

Установить водяной знак на изображение в 1С Битрикс

Установить водяной знак на изображение в 1С Битрикс

Как установить водяной знак на изображение на лету (перед показом пользователю), не трогая сам оригинал


Комментарии
Защита от автоматических сообщений
CAPTCHA
Введите слово на картинке