+7 495 008 8452 пн.-пт. 10:00 – 17:00
Загрузка...
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Уведомления об изменениях элементов инфоблоков

Если пользователи могут менять элементы инфоблока, администратору может быть удобно быть в курсе этих изменений. Ранее писал решение одной из таких задач, где форма обратной связи делалась на инфоблоках. Как раз там мне указывали на то, что править код для каждого инфоблока не удобно.


Теперь решил обобщить задачу и сделать возможность интерфейсно выбирать, любой инфоблок. За одно можно будет фиксировать изменения в журнале событий, тем более, способ теперь известен;)

Стандартный модуль документооборота отправляет уведомления почтой, но не всегда он есть и не всегда удобно его включать только ради почтовых уведомлений.


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



Название инфоблока сделано ссылкой, при клике по нему можно включать/выключать сразу все опции.
Раз уже стал делать "для ленивых", почтовое событие IBLOCK_ELEMENT_CHANGE_NOTIFY и шаблон для него создаются автоматически ;) В шаблон передаются все поля элемента.

В файл /bitrix/php_interface/init.php надо добавить код (создайте файл, если его нет):

AddEventHandler("iblock", "OnAfterIBlockElementAdd", "IBlockNotifyHandler");
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", "IBlockNotifyHandler");
AddEventHandler("iblock", "OnBeforeIBlockElementDelete", "IBlockNotifyHandler");

function IBlockNotifyHandler(&$arFields)
{
   if (is_array($arFields))
      $f = $arFields;
   else // delete
   {
      $rs = CIBlockElement::GetById($arFields);
      $f = $rs->Fetch();
   }

   if (!$f['ID'])
      return;
   
   if (($FLAG = COption::GetOptionString('iblock', 'notify_'.$f['IBLOCK_ID'], 0)) == 0)
      return;

   $d = debug_backtrace();
   $method = strtolower($d[3]['function']);

   $arMethod = array(
      'add' => array('TEXT' => 'Добавление элемента инфоблока',    'MAIL_FLAG' => 1, 'LOG_FLAG' => 256),
      'update' => array('TEXT' => 'Изменение элемента инфоблока',    'MAIL_FLAG' => 2, 'LOG_FLAG' => 512),
      'delete' => array('TEXT' => 'Удаление элемента инфоблока',    'MAIL_FLAG' => 4, 'LOG_FLAG' => 1024),
   );

   if (!array_key_exists($method, $arMethod))
      return;

   if ($FLAG & $arMethod[$method]['MAIL_FLAG'])
   {
      $subject = $arMethod[$method]['TEXT'].' ['.$f["IBLOCK_ID"].'] '.CIBlock::GetArrayByID($f['IBLOCK_ID'], 'NAME');
      $arSend = $f;
      $arSend['SUBJECT'] = $subject;

      $arSite = array();
      $rs = CSite::GetList($by, $order);
      while($ar = $rs->Fetch())
         $arSite[] = $ar['ID'];

      CEvent::Send('IBLOCK_ELEMENT_CHANGE_NOTIFY',$arSite,$arSend);
   }

   if ($FLAG & $arMethod[$method]['LOG_FLAG'])
   {
      if (!$subject)
         $subject = $arMethod[$method]['TEXT'].' ['.$f["IBLOCK_ID"].'] '.CIBlock::GetArrayByID($f['IBLOCK_ID'], 'NAME');

      CEventLog::Add(array(
         "SEVERITY" => "SECURITY",
         "AUDIT_TYPE_ID" => $arMethod[$method]['TEXT'],
         "MODULE_ID" => "iblock",
         "ITEM_ID" => $f['ID'],
         "DESCRIPTION" => $subject,
      ));
   }
} 


После изменений элементов в журнале событий получим сообщения вида:



За одно сделал такую фишку: при удалении элемента обработчик вешается но событие до удаления, а не после, как в остальных случаях. Это позволяет отправить администратору на почту данные элемента (на случай их последующего восстановления).



Назад в раздел

Подписаться на новые материалы раздела:
Загрузка...