Реализация регистрации кликов в проектах на Bitrix (PHP)
Основные способы отслеживания кликов в 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')
));
?>Пояснение шагов:
- Подключение модуля statistic.
- Формирование массива с данными: EVENT — системное имя события, EVENT_NAME — название для отчётов, SESSION_ID и GUEST_ID можно оставить пустыми (заполнятся автоматически), URL — страница, где произошёл клик, URL_TO — целевая страница.
- Метод возвращает идентификатор события или 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();";
}
}Результат: каждую минуту все накопленные клики записываются в статистику одной группой, что уменьшает число запросов к БД.