Счётчик нажатий в Bitrix с помощью PHP и AJAX

В этой статье представлен пример реализации счётчика нажатий в CMS 1С-Битрикс с использованием AJAX-запроса и свойства инфоблока. При загрузке страницы показывается текущее значение в свойстве CLICK_COUNT, а при нажатии на кнопку оно увеличивается на 1.

Счётчик нажатий в Bitrix с помощью PHP и AJAX

index.php

<?php
// Подключаем Bitrix
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');

CModule::IncludeModule('iblock');

// Укажите ID инфоблока и элемента
$iblockId = 2; // Ваш ID инфоблока
$elementId = 40; // ID элемента для получения счётчика

// Получаем текущий счётчик
$propertyRes = CIBlockElement::GetProperty(
    $iblockId,
    $elementId,
    ['sort' => 'asc'],
    ['CODE' => 'CLICK_COUNT']
);

$currentCount = 0;
if ($propertyArray = $propertyRes->Fetch()) {
    $currentCount = (int)$propertyArray['VALUE'];
}
?>
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Счетчик нажатий</title>
    <style>
        #clickButton {
            padding: 10px 20px;
            font-size: 16px;
            cursor: pointer;
        }
        #clickCount {
            font-size: 18px;
            margin-top: 10px;
        }
    </style>
</head>
<body>

<div>
    <button id="clickButton" data-element-id="<?=$elementId?>">Нажми меня</button>
    <div>Количество нажатий: <span id="clickCount"><?php echo $currentCount; ?></span></div>
</div>

<script>
    document.addEventListener('DOMContentLoaded', () => {
        const button = document.getElementById('clickButton');
        const clickCountElement = document.getElementById('clickCount');

        button.addEventListener('click', () => {
            const elementId = button.getAttribute('data-element-id');

            fetch('/ajax/update_click_count.php', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded',
                },
                body: new URLSearchParams({ element_id: elementId })
            })
            .then(response => response.json())
            .then(data => {
                if (data.success) {
                    // Обновляем текст счётчика
                    clickCountElement.textContent = data.count;
                } else {
                    console.error('Ошибка обновления счётчика:', data.errors);
                }
            })
            .catch(error => {
                console.error('Ошибка запроса:', error);
            });
        });
    });
</script>

</body>
</html>

/ajax/update_click_count.php

<?php
use Bitrix\Main\Loader;

require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');

$GLOBALS['APPLICATION']->RestartBuffer();
header('Content-Type: application/json');

// Разрешаем только метод POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    echo json_encode([
        'success' => false,
        'errors'  => ['Неверный метод запроса.']
    ]);
    die();
}

// Проверяем, загружен ли модуль iblock
if (!Loader::includeModule('iblock')) {
    echo json_encode([
        'success' => false,
        'errors'  => ['Модуль инфоблоков не загружен.']
    ]);
    die();
}

// Получаем ID элемента из POST
$elementId = (int)$_POST['element_id'];

// Укажите ID вашего инфоблока
$iblockId = 2; // Замените на свой ID инфоблока

// Проверяем, существует ли элемент
$checkElement = CIBlockElement::GetList(
    [],
    ['IBLOCK_ID' => $iblockId, 'ID' => $elementId],
    false,
    false,
    ['ID']
)->Fetch();

if (!$checkElement) {
    // Элемент не найден
    echo json_encode([
        'success' => false,
        'errors'  => ['Элемент с указанным ID не найден.']
    ]);
    die();
}

// Получаем текущее значение свойства CLICK_COUNT
$propertyRes = CIBlockElement::GetProperty(
    $iblockId,
    $elementId,
    ['sort' => 'asc'],
    ['CODE' => 'CLICK_COUNT']
);

$currentCount = 0;
if ($propertyArray = $propertyRes->Fetch()) {
    $currentCount = (int)$propertyArray['VALUE'];
}

// Увеличиваем счётчик
$newCount = $currentCount + 1;

// Обновляем свойство
CIBlockElement::SetPropertyValuesEx($elementId, $iblockId, [
    'CLICK_COUNT' => $newCount
]);

// Возвращаем JSON-ответ
echo json_encode([
    'success' => true,
    'count'   => $newCount
]);

die();
?>

Теперь вы можете разместить эти файлы в соответствующих местах: index.php в корне сайта (или другом нужном разделе), а update_click_count.php в папке /ajax/. В результате при загрузке страницы index.php будет сразу отображаться текущее число кликов, а при нажатии на кнопку это число будет увеличиваться и возвращаться в формате JSON.

Теги:  Битрикс, рецепты

Интернет-магазин от 120 000 руб., срок от 4 недель

Платформа для продажи товаров или услуг. Включает интерактивные формы обратной связи в каждой карточке товара, а также множество статичных и динамичных разделов.

Корпоративный сайт от 60 000 руб., срок от 3 недель

Готовый информационный ресурс, включающий лицензию на 1С-Битрикс «Стандарт», технологию «Композитный сайт».

Лендинг от 25 000 руб., срок от 2 недель

Компактный сайт, идеально подходящий для старта. На одной странице можно представить ключевые преимущества вашей компании и разместить форму для обратной связи.