В этой статье рассмотрим вывод количества просмотров элемента инфоблока в 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.