Реализация регистрации кликов в проектах на Bitrix (PHP)

Раздел: Работа с CMS Bitrix -> Работа с Bitrix

Основные способы отслеживания кликов в Bitrix на PHP

Для фиксации действий пользователей на сайте, работающем на CMS Bitrix, часто требуется регистрировать клики по элементам. Рассмотрены несколько подходов: от встроенного модуля статистики до собственных AJAX-обработчиков.

Наиболее эффективное решение — использование модуля «Статистика» (statistic) и метода CStatEvent::Add. Этот способ позволяет записывать события в базу данных с последующей аналитикой.

Пример регистрации клика по ссылке:

<?php
CModule::IncludeModule("statistic");
$eventId = CStatEvent::Add(array(
    "EVENT" => "click_link",
    "EVENT_NAME" => "Клик по ссылке",
    "SESSION_ID" => "",
    "GUEST_ID" => "",
    "URL" => "/some-link",
    "URL_TO" => "/target-page",
    "ADDITIONAL" => array('param1' => 'value1')
));
?>

Пояснение шагов:

  1. Подключение модуля statistic.
  2. Формирование массива с данными: EVENT — системное имя события, EVENT_NAME — название для отчётов, SESSION_ID и GUEST_ID можно оставить пустыми (заполнятся автоматически), URL — страница, где произошёл клик, URL_TO — целевая страница.
  3. Метод возвращает идентификатор события или false при ошибке.

Типичные проблемы:

  • Модуль statistic не установлен или отключён. Решение — активировать модуль в административной панели.
  • События не записываются при включённом кешировании страниц. Решение — использовать отложенные функции или добавлять вызов CStatEvent::Add через AJAX.
  • Метод возвращает false. Рекомендуется проверить права доступа к таблицам и конфигурацию события в модуле статистики.

Как отследить клик без перезагрузки страницы?

Для этого используется AJAX-запрос к серверу, который вызывает CStatEvent::Add. Пример на JavaScript (файл script.js):

fetch('/ajax/track_click.php', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({event: 'button_click', element: '#submit'})
});

Обработчик track_click.php:

<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
CModule::IncludeModule("statistic");
$data = json_decode(file_get_contents('php://input'), true);
CStatEvent::Add(array(
    "EVENT" => $data['event'],
    "EVENT_NAME" => "Клик по элементу",
    "URL" => $_SERVER['HTTP_REFERER']
));
?>

Возможные ошибки: заголовки CORS, если домен отличается. Решение — настроить CORS на сервере.

Как задействовать пользовательские события Bitrix?

Можно обрабатывать все запросы через обработчик события OnBeforeProlog. Пример в файле init.php:

Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'main',
    'OnBeforeProlog',
    function() {
        // Логика фиксации клика (например, если передан параметр 'click' в GET)
        if ($_GET['click'] === '1') {
            CModule::IncludeModule("statistic");
            CStatEvent::Add(array(
                "EVENT" => "onbeforeprolog_click",
                "EVENT_NAME" => "Событие перед прологом"
            ));
        }
    }
);

Этот способ подходит для глобальной фиксации, но нагружает сервер при каждом запросе.

Что делать, если модуль statistic недоступен?

Можно написать собственный код записи в лог или базу данных. Пример записи в файл:

$log = date("Y-m-d H:i:s")." | Клик | ".$_SERVER['REQUEST_URI']."\n";
file_put_contents($_SERVER['DOCUMENT_ROOT']."/click_log.txt", $log, FILE_APPEND);

Или использовать Bitrix\Main\ORM для записи в свою таблицу.

Расширенные примеры отслеживания кликов

Пример 1: Полная структура с формой и AJAX

Создадим форму с кнопкой и JavaScript-обработчиком, который отправляет данные на сервер для регистрации клика.

HTML (шаблон компонента):

Пример
<form id="myForm">
    <button type="button" id="trackBtn" data-event="form_submit">Отправить заявку</button>
</form>

<script>
document.getElementById('trackBtn').addEventListener('click', function() {
    var eventName = this.getAttribute('data-event');
    fetch('/ajax/track.php', {
        method: 'POST',
        headers: {'Content-Type': 'application/x-www-form-urlencoded'},
        body: 'event=' + encodeURIComponent(eventName) + '&url=' + encodeURIComponent(window.location.href)
    });
});
</script>

Файл /ajax/track.php:

Пример
<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
CModule::IncludeModule("statistic");

$event = $_POST['event'] ?? 'unknown';
$url = $_POST['url'] ?? $_SERVER['HTTP_REFERER'];

$result = CStatEvent::Add(array(
    "EVENT" => $event,
    "EVENT_NAME" => "Клик из формы",
    "URL" => $url,
    "ADDITIONAL" => array(
        'ip' => $_SERVER['REMOTE_ADDR']
    )
));

if ($result) {
    echo 'ok';
} else {
    http_response_code(500);
    echo 'error';
}
?>

Результат: в таблице b_stat_event появляется запись с указанными данными.

ID: 1245 | EVENT: form_submit | URL: /my-page | ADDITIONAL: {'ip':'192.168.1.1'}

Пример 2: Отслеживание кликов с передачей сессии и гостя

Можно передать идентификаторы сессии и гостя из Bitrix, чтобы связать событие с конкретным посетителем.

Пример
$sessionId = \Bitrix\Main\Application::getInstance()->getKernelSession()->getId();
$guestId = CUser::GetGuestID();

CStatEvent::Add(array(
    "EVENT" => "click_banner",
    "EVENT_NAME" => "Клик по баннеру",
    "SESSION_ID" => $sessionId,
    "GUEST_ID" => $guestId,
    "URL" => $_SERVER['REQUEST_URI'],
    "URL_TO" => "https://example.com/landing"
));

Пояснение: GetGuestID() возвращает идентификатор гостя, привязанного к cookies Bitrix. Если гость не определён, можно использовать \Bitrix\Main\Service\GeoIp\Manager для определения гео.

Пример 3: Пакетная регистрация событий через агент

Иногда требуется добавить несколько событий одновременно для снижения нагрузки. Используется агент Bitrix, который раз в минуту выгружает накопленные данные из временной таблицы.

Пример
// В временной таблице сохраняем события (например, в $_SESSION['events'])
// Затем агент:
class ClickTrackerAgent {
    public static function processEvents() {
        $events = $_SESSION['events'] ?? [];
        if (empty($events)) return "ClickTrackerAgent::processEvents();";
        CModule::IncludeModule("statistic");
        foreach ($events as $eventData) {
            CStatEvent::Add($eventData);
        }
        unset($_SESSION['events']);
        return "ClickTrackerAgent::processEvents();";
    }
}

Результат: каждую минуту все накопленные клики записываются в статистику одной группой, что уменьшает число запросов к БД.

Отслеживание кликов в Bitrix PHP - comments

En
Bitrix click php (php)