Усиливаем
IT-команды
с 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” – ещё не отправлялось

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

Другие наши статьи
Забудьте про автоматизацию на списках: смарт-процессы в Битрикс24 решают все
Bitrix24
Юлиана
PHP-разработчик
Reflection API. Заглянуть внутрь своего кода или как программа может модифицировать собственную структуру.
Bitrix24
Вадим
PHP-разработчик
Связаться с нами
Оставьте заявку,
чтобы обсудить условия