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