Суть задачи: на сайте есть новостной раздел, представляющий из себя инфоблок с элементами. Пользователи с определенными правами добавляют, редактируют, удаляют новости. Необходимо вывести в публичной части сайта историю изменения в этом новостном разделе. Естественно, речь о сайте на платформе Битрикс (БУС, коробочная версия Б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 ); ?>
В результате мы получим информацию вида: дата, автор (кто выполнил действие), тип действия, информация об отредактированном элементе.
Оставить комментарий