Как вывести количество просмотров в Битриксе?

  • 16.01.2017

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