В этой статье рассмотрим вывод количества просмотров элемента инфоблока в CMS 1C Bitrix.
Для примера возьмем задачу по выводу просмотров для торгового предложения. Реализуем этот вариант через ajax подгрузку и периодическое сбрасывание кэша.
Шаг 1: Создаем файл файл get-counter.php в /ajax/
<? header("Content-type: application/json; charset=utf-8"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); define("NO_KEEP_STATISTIC", true); define("NO_AGENT_STATISTIC", true); define("NOT_CHECK_PERMISSIONS", true); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); $out = array(); if(CModule::IncludeModule("iblock") && isset($_REQUEST['id'])){ $filter = array("LOGIC" => "OR"); foreach($_REQUEST['id'] as $id){ $filter[] = array("ID"=>intval($id)); } $res = CIBlockElement::GetList(Array(), $filter, false, false, array("ID","SHOW_COUNTER")); while($ob = $res->GetNext()) { $out[$ob['ID']] = intval($ob['SHOW_COUNTER']); } } echo json_encode($out);
Шаг 2: В битрикс-шаблоне выводим:
<div data-cid="<?=$arResult['ID']?>"><?=intval($arResult['SHOW_COUNTER'])?></div>
Шаг 3: Нам нужна также и JS библиотека, которую можно в главный шаблон сайта положить:
(function ($) { $(document).ready(function(){ if ($("[data-cid]").length) { var $arrCid = $("[data-cid]"), $cid = []; $arrCid.each(function () { $cid.push(parseInt($(this).data("cid"))); }); $.ajax({ type: "POST", url: "/ajax/get-counter.php", data: {id: $cid}, dataType: "json" }).done(function (data) { $arrCid.each(function () { var $ths = $(this), cid = String($ths.data("cid")); if (data[cid]) $ths.html(data[cid]); }); }); } }); })(jQuery);
Шаг 4: Теперь описываем работу с кэшем (случайный сброс):
это происходить будет в файле component_epilog.php
clearShowCounter($arResult['ID'], &$this);
в файл /bitrix/php_interface/init.php
// функция сброса кэша для просмотра количества function clearShowCounter($ID, $ths){ if(isset($_SESSION["IBLOCK_COUNTER"])) $_SESSION["IBLOCK_COUNTER"] = array(); // сотрем всех $res = CIBlockElement::GetList(Array(), array("ID" => $ID), false, false, array("SHOW_COUNTER")); if($ob = $res->GetNext()) { $clear = false; $cnt = $ob['SHOW_COUNTER']; // разная логика при разных числах просмотра if($cnt<500) { $i = crc32($ID)%10; // число на котором будет обновление if(($cnt%10)==$i) $clear = true; } else { $i = round(crc32($ID)%100); // число на котором будет обновление if(round($cnt%100)==$i) $clear = true; } if($clear) $ths->clearComponentCache("bitrix:news.detail"); } }
Comments are closed.