Разрабатываем web-проекты с 2016 года
Назад в блог
Bitrix: управление сайтом
Создание своей триггерной рассылки битрикс на закрытых событиях
Вадим
PHP-разработчик
Создание своей триггерной рассылки битрикс на закрытых событиях

Бывает, что надо сделать рассылку клиентам, например когда снизится цена у товара из избранного.

У Bitrix есть модуль для массовой рассылки, но иногда бывает, что не хватает его базовых триггеров. Но можно создать свой триггер.

Что делают триггеры?

Триггеры – это обработчики событий. Когда срабатывает какое-то событие, оно вызывает триггер и почта отправляется.

Триггеры закрытых событий работают в определённое время (запускаются с агентом), например, запускаются один раз в день в 2 часа дня.

Покажу на примере триггера закрытых событий

Настройка сервера

Первым и самым важным действием нужно настроить почтовый сервер.

Я использовал MSMTP - https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=37&LESSON_ID=9325&LESSON_PATH=3908.6488.5501.9325

Регистрация события

После этого нужно зарегистрировать событие.

$eventManager->addEventHandler("sender", "OnTriggerList", array("MyClass", "onTriggerList"));

В классе должен быть статический метод

public static function onTriggerList(Event $event): Event
{
    TriggerClass::addTriggerInList($event);
    return $event;
}

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

Он обращается к классу триггера и его методу, который зарегистрирует триггер в модуле sender

public static function addTriggerInList(Event &$event): Event
{
    $event->addResult(new EventResult(EventResult::SUCCESS, [
          'TRIGGER' => [                 'TriggerClass'           ]     ],
    'myModule',
    ));
    return $event;
}

Так выглядит пустой триггер-класс:

<?php

namespace …;

Loader::includeModule('sender');

class SenderProductsInFavorite extends \Bitrix\Sender\Trigger\TriggerConnectorClosed
{
    public function getName(): string
    {
          return "";    
}
    public function getCode()
    {
          return "";
    }

    public static function canBeTarget(): bool
    {
          return false;
    }

    public function filter(): bool
    {

          return false;
    }
    public static function getPersonalizeList(): array
    {
           return [];
    }

    public function getForm(): string
    {
          return '';
    }

    public function getRecipient()
    {
           return $this->recipient;
    }

}

Триггер закрытых событий наследуется от \Bitrix\Sender\Trigger\TriggerConnectorClosed;

Если триггер работает с закрытыми событиями, будет вызываться агент в определённое время

Если в коде будет использоваться ORM, для запросов к таблицам, то стоит перед этим подключить модуль


getName() – возвращает название триггера, который отобразиться в админке.

getCode() – Должен быть уникальным (лучше всего использовать префикс модуля).

canBeTarget() – может ли триггер использоваться как цель, а не только для запуска (у любой рассылки есть цель. Например, пользователь увидел письмо, а целью письма является покупка на сайте. Статистика отобразиться в админке).

filter() – должен вернуть true или false. Это будет говорить о том запускать ли рассылку. Это важный метод, в нём и пишется вся логика рассылки.

Доступно свойство $this->recipient от родителя. В этом свойстве хранятся адресаты, кому послать письмо (должен быть массив).Если адресатов несколько, тогда нужен массив массивов.

Необходимые ключи в массиве: [‘USER_ID’, ‘EMAIL’ ‘NAME’]

Примерно такой массив:


Пример кода: 

if (count($mails) > 0) {
    $this->recipient = $mails;
   return true;
} else {
   return false;
}

getPersonalizeList() – в этом методе определяются переменные, которые будут доступны внутри шаблона письма (например #PRODUCT_ID#)

В переменных нельзя хранить html, он отобразиться в письме как текст.

public static function getPersonalizeList(): array
{
    return array(
          array(                 'CODE' => 'PRODUCT_ID',                 'NAME' => 'ID продуктов',                 'DESC' => '',           ),     );
}

getForm() – вернёт дополнительную форму настройки триггера

public function getRecipient()
{
    return $this->recipient;
}

getRecipient() – вернёт список адресатов кому отправить письмо

Как дебажить?

Можно тремя способами:

1) Запускать агент в командной строке php, А в коде указывать print_r(); die;

2) Xdebug

3) Можно на отдельной странице сайта сформировать массив из кода который будет использоваться в filter()

Настройка триггера в админке

Чтобы триггер заработал, нужно создать рассылку в самом модуле с созданным триггером.

Перейти по пути «Маркетинг->Триггерные рассылки»

Добавить триггер вручную


Триггер отобразиться в списке


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


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



Выбирается нужный шаблон рассылки.

После добавления письма, нужно настроить отправку письма после события (оптимальное решение ставить «после 1 минуты после события»), если нужно чтобы триггер сработал быстро.


И запустить рассылку


Чтобы проверить работу рассылки можно использовать вызов из командной строки агента. Перейти в админке в «Агенты» 


Первая функция - вызывает рассылку, вторая – запускает.

Очень похожи функции, но первая срабатывает, вызывая вторую. Для этого в письме стоит настройка через какое время отправить письмо после события.Очень поможет это при тестировании рассылки.

Иногда после вызова второй функции не сразу отправляется письмо, нужно вызвать её заново


\Bitrix\Sender\TriggerManager::fireClosedEventAgent("sender", "neti.favorite_neti_favorite_trigger_low_price", "22"); - где 22 id письма рассылки


\Bitrix\Sender\MailingManager::checkPeriod($id) – в эту переменную передаётся id

Чтобы узнать какой Id у рассылки можно её останавливать и запускать проверяя таблицу агентов. Триггер должен пропадать при остановке рассылки.

Как правильно удалять триггер

Когда нужно удалить триггерную рассылку, сначала её надо остановить, чтобы из базы удалились агенты


Статистика

Вся статистика отправленных/неотправленных писем отобразиться в получателях:



Все отправленные письма сохраняются в таблице b_sender_posting_recipient.


Статусы:

“N” – отправлено

“E” – С ошибками

“Y” – ещё не отправлялось

Так же эти статусы можно увидеть в получателях

Поделитесь

Напишите нам. Мы поможем решить вашу задачу