Просмотренные товары
<?php
/*
* Класс формирует массив ID просмотренных товаров.
*/
namespace Fismart\Core;
use Bitrix\Catalog\CatalogViewedProductTable;
class ViewProduct
{
/**
* @param int $limit
* @param null|int $userId
*
* @return array
*/
public function getLastProductIds($limit = 10, $userId = null)
{
$result = array();
$fuserId = \CSaleBasket::GetBasketUserID();
if ($userId && $userId > 0) {
$fuserId = $userId;
}
$viewedIterator = CatalogViewedProductTable::getList(array(
'order' => array('DATE_VISIT' => 'DESC'),
'filter' => array('FUSER_ID' => $fuserId, 'SITE_ID' => SITE_ID),
'select' => array('ID', 'PRODUCT_ID'),
'limit' => $limit,
));
while($arItem = $viewedIterator->fetch()) {
$result[] = $arItem['PRODUCT_ID'];
}
return $result;
}
}
<?php // catalog/element.php - там где нужно вывести viewed products
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true)
die();
use Fismart\Core\ViewProduct;
<?/*------------------- ... ---------------------------*/?>
<?/*---------- вывод просмотренных товаров ------------*/?>
// собираем ID просмотренных товаров
$viewProduct = new ViewProduct();
$arViewed = $viewProduct->getLastProductIds();
// формируем фильтр
if (!empty($arViewed)) {
global $arrFilter;
$arrFilter["ID"] = $arViewed;
$arrFilter["!ID"] = $ElementID;
$arrFilter['>CATALOG_QUANTITY'] = 0;
\Bitrix\Main\Page\Frame::getInstance()->startDynamicWithID('watched');?>
<?$APPLICATION->IncludeComponent(
"bitrix:catalog.section",
"",
Array(
// ........
"FILTER_NAME" => "arrFilter",
// ........
)
);?>
<?\Bitrix\Main\Page\Frame::getInstance()->finishDynamicWithID('watched', '');
} else {
echo "<p class='non-items'>В вашем списке еще нет товаров.</p>";
}?>
</div>
<?php
// в шаблон catalog.element добавляем скрипт
?>
<script type="text/javascript">
var viewedCounter = {
path: '/bitrix/components/bitrix/catalog.element/ajax.php',
params: {
AJAX: 'Y',
SITE_ID: "<?= SITE_ID ?>",
PRODUCT_ID: "<?= $arResult['ID'] ?>",
PARENT_ID: "<?= $arResult['ID'] ?>"
}
};
BX.ready(
BX.defer(function(){
BX.ajax.post(
viewedCounter.path,
viewedCounter.params
);
})
);
</script>