
Бывает, что надо сделать рассылку клиентам, например когда снизится цена у товара из избранного.
У 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” – ещё не отправлялось
Так же эти статусы можно увидеть в получателях
чтобы обсудить условия