Top.Mail.Ru
Перехват почтового события в Битрикс и запись данных в логи - разработка и поддержка сайтов BUSSOL

Перехват почтового события в Битрикс и запись данных в логи



Автор:

Дата публикации:

Перехват почтового события в Битрикс и запись данных в логи

Иногда при отправке письма с сайта необходимо выполнить "под капотом сайта" какие-либо действия. Например, при создании нового заказа срабатывает системное почтовое событие SALE_NEW_ORDER, которое отправляет на почту клиенту данные о его заказе. А мы, допустим, хотим при этом отправить данные о заказе еще куда-то: в CRM, в 1С или в Telegramm. Рассмотрим как это можно сделать. Для начала переопределим событие OnBeforeEventSend, привязав к нему выполнение функции postOrder:


AddEventHandler('main', 'OnBeforeEventSend', 'postOrder');

Таким образом перед вызовом события отправки письма будет вызвана функция postOrder. Ниже ее код:


function postOrder($arFields, $arTemplate){
    if($arTemplate["EVENT_NAME"] == "SALE_NEW_ORDER"){
         //Ваш код
    }

    return true;
}

Функция принимает два параметра: 1 - массив полей данных, которые передаются в шаблон письма (в нашем случае данные нового заказа); 2 - массив данных самого шаблона. В данном примере мы проверяем, что шаблон привязан к событию SALE_NEW_ORDER. И если это так, то в теле условия пишем нужный нам код.

Решим следующую задачу. Пусть на нужно при создании нового заказа записать в логи данные этого заказа. Точнее записать те данные, которые передаются в почтовый шаблон. Тогда функцию postOrder можно записать так:


function postOrder($arFields, $arTemplate){
    if($arTemplate["EVENT_NAME"] == "SALE_NEW_ORDER"){
	$file = $_SERVER["DOCUMENT_ROOT"]."/app.log";
	writeLog($arFields,'result',$file);
    }

    return true;
}

В переменную $file помещаем абсолютный путь до файла app.log, в который будут записываться логи. Далее, использую функцию writeLog, поместим массив данных письма $arFields в этот файл. Ниже приведен код функции writeLog:


function writeLog($data, $title = 'logs',$file){
    $log = "\n------------------------\n";
    $log .= date("Y.m.d G:i:s") . "\n";
    $log .= (strlen($title) > 0 ? $title : 'DEBUG') . "\n";
    $log .= print_r($data, 1);
    $log .= "\n------------------------\n";
    file_put_contents($file, $log, FILE_APPEND);
    return true;
}

В сущности можно было обойтись и без этой функции, а добавление осуществить с помощью стандартной функции file_put_contents. Функция writeLog делает вывод форматированным с дополнительными данными.

241027, Россия, Брянская область, поселок Путевка, улица Рослальская, дом 8, кв.121
Телефон: +7 (950) 692-91-71

Иногда при отправке письма с сайта необходимо выполнить "под капотом сайта" какие-либо действия. Например, при создании нового заказа срабатывает системное почтовое событие SALE_NEW_ORDER, которое отправляет на почту клиенту данные о его заказе. А мы, допустим, хотим при этом отправить данные о заказе еще куда-то: в CRM, в 1С или в Telegramm. Рассмотрим как это можно сделать. Для начала переопределим событие OnBeforeEventSend, привязав к нему выполнение функции postOrder:


AddEventHandler('main', 'OnBeforeEventSend', 'postOrder');

Таким образом перед вызовом события отправки письма будет вызвана функция postOrder. Ниже ее код:


function postOrder($arFields, $arTemplate){
    if($arTemplate["EVENT_NAME"] == "SALE_NEW_ORDER"){
         //Ваш код
    }

    return true;
}

Функция принимает два параметра: 1 - массив полей данных, которые передаются в шаблон письма (в нашем случае данные нового заказа); 2 - массив данных самого шаблона. В данном примере мы проверяем, что шаблон привязан к событию SALE_NEW_ORDER. И если это так, то в теле условия пишем нужный нам код.

Решим следующую задачу. Пусть на нужно при создании нового заказа записать в логи данные этого заказа. Точнее записать те данные, которые передаются в почтовый шаблон. Тогда функцию postOrder можно записать так:


function postOrder($arFields, $arTemplate){
    if($arTemplate["EVENT_NAME"] == "SALE_NEW_ORDER"){
	$file = $_SERVER["DOCUMENT_ROOT"]."/app.log";
	writeLog($arFields,'result',$file);
    }

    return true;
}

В переменную $file помещаем абсолютный путь до файла app.log, в который будут записываться логи. Далее, использую функцию writeLog, поместим массив данных письма $arFields в этот файл. Ниже приведен код функции writeLog:


function writeLog($data, $title = 'logs',$file){
    $log = "\n------------------------\n";
    $log .= date("Y.m.d G:i:s") . "\n";
    $log .= (strlen($title) > 0 ? $title : 'DEBUG') . "\n";
    $log .= print_r($data, 1);
    $log .= "\n------------------------\n";
    file_put_contents($file, $log, FILE_APPEND);
    return true;
}

В сущности можно было обойтись и без этой функции, а добавление осуществить с помощью стандартной функции file_put_contents. Функция writeLog делает вывод форматированным с дополнительными данными.


Другие статьи:  Уведомление о файлах Cookie на Битрикс / Получить заказы пользователя с сортировкой по дате создания / Сделать информер "Товары добавлены в корзину" вместо стандартного окна

Похожие статьи