CEventLog: вывод журнала событий с постраничной навигацией

Суть задачи: на сайте есть новостной раздел, представляющий из себя инфоблок с элементами. Пользователи с определенными правами добавляют, редактируют, удаляют новости. Необходимо вывести в публичной части сайта историю изменения в этом новостном разделе. Естественно, речь о сайте на платформе Битрикс (БУС, коробочная версия Б24). Для решения данной задачи мы будем использовать стандартный журнал событий (находится здесь /bitrix/admin/event_log.php), но предварительно разберем все доступные методы класса для работы с логом -  CEventLog.

Получение списка событий

CEventLog::GetEventTypes(). Не требует никаких дополнительных параметров. Возвращает код и название всех типов событий.

...
[FILE_ADD] => [FILE_ADD] Добавление файла
[FILE_COPY] => [FILE_COPY] Копирование файла
[FILE_DELETE] => [FILE_DELETE] Удаление файла
[FILE_EDIT] => [FILE_EDIT] Изменение файла
[FILE_MOVE] => [FILE_MOVE] Перемещение файла
...

Добавление записи в лог

Для этих целей можно использовать обертку CEventLog::Log() или непосредственно метод CEventLog::Add(). Список доступных полей и их описание можно найти в документации. Пример использования:

<?
CEventLog::Add(array(
    "SEVERITY" => "SECURITY",
    "AUDIT_TYPE_ID" => "MY_OWN_TYPE",
    "MODULE_ID" => "main",
    "ITEM_ID" => 123,
    "DESCRIPTION" => "Какое-то описание",
));
?>

Метод агента для удаления устаревших записей

CEventLog::CleanUpAgent. Метод получает из настроек главного модуля значение поля «Сколько дней хранить события» и удаляет устаревшие записи.

Удаление записей

Методов для удаления записей данный класс не предоставляет. Также нет возможности удаления записей через админ-панель. Но если очень нужно, то сделать это можно прямыми запросами.

//получим несколько записей из БД чтобы остакомиться со структурой таблицы
SELECT * FROM `b_event_log` LIMIT 10;
//удалим запись по ее идентификатору
DELETE FROM b_event_log WHERE ID = 123;

Получение списка записей

CEventLog::GetList. Метод позволяет получить отфильтрованный и отсортированный список записей из журнала событий. Именно этот метод мы и будем использовать для решения нашей задачи.

<?php
//названия типов события, с которыми мы будем работать
$types = [
    'IBLOCK_ELEMENT_ADD' => 'Добавление',
    'IBLOCK_ELEMENT_EDIT' => 'Редактирование',
    'IBLOCK_ELEMENT_DELETE' => 'Удаление',
];

$nav = new \Bitrix\Main\UI\PageNavigation("next");
$nav->allowAllRecords(false)
    ->setPageSize(50)
    ->initFromUri();
$rsLog = CEventLog::GetList(
    ['ID' => 'DESC'],
    [
        //выбираем интересующие нас события (добавление, редактирование, удаление)
        '=AUDIT_TYPE_ID' => ['IBLOCK_ELEMENT_ADD', 'IBLOCK_ELEMENT_EDIT', 'IBLOCK_ELEMENT_DELETE',],
        //указываем модуль, с которым будем работать
        'MODULE_ID' => 'iblock',
        //индентификатор нашего инфоблока
        'ITEM_ID' => 142,
        //ограничим по дате, получаем записи только после указанной даты
        'TIMESTAMP_X_1' => '12.12.2023 00:00:00',
    ],
    [
        "nPageSize" => $nav->getPageSize(),
        "iNumPage" => $nav->getCurrentPage(),
    ],

);

$nav->setRecordCount($rsLog->NavRecordCount);
while ($arLog = $rsLog->GetNext()) {
    //получим данные пользователя
    $user = CUser::GetByID($arLog['USER_ID'])->Fetch();
    ?>
    <div><?= $arLog['TIMESTAMP_X'] ?></div>
    <div><a href="/company/personal/user/<?= $user['ID'] ?>/"><?= $user['NAME'] ?> <?= $user['LAST_NAME'] ?></a></div>
    <div><?= $types[$arLog['AUDIT_TYPE_ID']] ?? $arLog['AUDIT_TYPE_ID'] ?></div>
    <div>
        <?
        $logData = unserialize(htmlspecialcharsback($arLog['DESCRIPTION']));
        ?>
        <a target="_blank" href="/news/<?= $logData['ID'] ?>/"><?= $logData['NAME'] ?></a>
    </div>

    <?
}
//компонент постраничной навигации
$APPLICATION->IncludeComponent(
    "bitrix:main.pagenavigation",
    "",
    array(
        "NAV_OBJECT" => $nav,
        "SEF_MODE" => "N",
    ),
    false
);
?>

В результате мы получим информацию вида: дата, автор (кто выполнил действие), тип действия, информация об отредактированном элементе.

Опубликовано: 1 февраля 2024 года, в рубрике «Битрикс».

Оставить комментарий

5000
  Подписаться  
Уведомление о
Поблагодарить автора статьи
Зачем это нужно