Делаем свои триггерные рассылки

Делаем свои триггерные рассылки

1. Как работают триггерные рассылки.2. Что делают триггеры.3. Как сделать свой триггер. 3.1. Простейший триггер 3.2. Получение данных события 3.3. Фильтрация в триггере 3.4. Свои поля персонализации 3.5. Фильтрация по сайту4. Триггер для ненаступивших событий5. Делаем готовую рассылку6. Итоги.

[spoiler]Все примеры в статье уложены в архив .Распакуйте его, затем папку sender скопируйте в /bitrix/php_interface/А затем в init.php подключите пример:

1. Как работают триггерные рассылки.

При наступлении события срабатывает триггер. Он определяет, отправлять ли рассылку и кому именно отправлять.Затем, для каждого адреса рассылки перед запуском проверяется: - не отписан ли адрес от рассылки; - двойной запуск; не запущена ли рассылка для одного адреса параллельно.К примеру, рассылка запускается по событию оплачен заказ.Если в рассылке указаны три письма, уходящие с промежутком 1 час, то если один и тот же человек оплатит два заказа с разницей в 10 минут,то по первому заказу рассылка запустится, вторая - не запустится.

Рассылка отмечается завершенной для адреса после: - или отправки всех писем; - или после выполнения целевого действия получателем.

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

Один и тот же триггер можно использовать в нескольких рассылках.И может запуститься для всех них.

2. Что делают триггеры. Триггеры - это обработчики события .Поэтому, все доступные данные в обычных обработчиках события доступны и в триггере.

Они находят адреса получателей рассылки.К примеру, из данных события: событие добавления комментария в блог возвращает AUTHOR_ID - код пользователя-автора комментария.В триггере можно по этому коду выбрать поля пользователя - имя и емайл. Их и вернуть в качестве данных получателя.

Они разрешают или запрещают запуск рассылки для конкретного адреса.Запуск рассылки можно запрограммировать безусловным, либо в зависимости от данных события, либо вашей бизнес-логики.К примеру, проверять: - на каком сайте произошло событие; - в админке или публичке; - время днем или ночью.

3. Как сделать свой триггер.

3.1. Простейший триггер

Для начала выберем событие, к примеру в блоге добавление комментария OnCommentAdd http://dev.1c-bitrix.ru/api_help/blogs/events/index.php

Теперь создадим класс SenderTriggerBlogComment, который обязательно наследуется от класса \Bitrix\Sender\Trigger

getName() - возвращает название триггера. Оно выводится в списке целей и условий запуска.

getCode() - возвращает код триггера, уникальный в рамках модуля. Желательно указывать свой префикс, чтобы коды не пересеклись.

getEventModuleId() - возвращает модуль, который генерирует событие, на которое срабоает триггер.

getEventType() - возвращает событие, на которое должен сработать триггер.

getRecipient() - возвращает массив или объект одного адреса или списка адресов. Результат может быть в в виде массива, или \Bitrix\Main\DB\Result, или старый добрый CDBResult.

filter() - возвращает true или false. Результат указывает запускать ли рассылку или нет. В функции можно указывать свои условия фильтрации события, свои выборки адресов.

getForm() - возвращает форму настройки триггера. Форма выведется на странице указания событий запуска и цели.

Теперь подключим триггер. Для этого, сохраним класс триггера в файл /bitrix/php_interface/trigger_blog_comment.php Далее, нам нужно повесить обработчик события запроса списка триггеров. Для этого в /bitrix/php_interface/init.php добавим код:

3.2. Получение данных события Чтобы получить данные, передаваемые в событии, нужно воспользоваться методом getParam('EVENT'):

Ну а теперь вернемся к нашему триггеру. Как видим, в getRecipient прописан вручную адрес ivan@example.com Давайте отправлять рассылку автору комментария. При событии добавления комментария в функцию-обработчик передается два параметра. Первый - код добавленного коммента. Второй - массив, переданный в CBlogComment::Add. Таким образом, мы в триггере можем получить код автора:

Теперь по этому коду, мы можем получить емайл и имя пользователя. Изменим метод getRecipient:

3.2. Форма настройки триггера В типовом решении магазина комментарии блогов используются в качестве комментариев к товарам. Допустим, мы хотим запускать рассылку только при добавлении комментариев в конкретном одном блоге.

Для этого сделаем форму настройки:

getFieldName() - функция-обертка для получения имени поля для возможности его сохранения. getFieldValue() - функция возвращает текущее сохраненное значение настройке.

3.3. Фильтрация в триггере В форме настроек триггера появился список блогов, но когда добавляем коммент в другой блог, рассылка все равно запускается. Теперь в методе filter() сравним блог, выбранный в настройках, с блогом, в который добавлен коммент:

3.4. Свои теги персонализации

#EMAIL# , #NAME# , #USER_ID# - маловато полей персонализации. Как сделать больше полей? Давайте добавим еще три тега: код комментария, код поста, код блога.

Теперь теги доступны для использования в теле писем: #BLOG_COMMENT_ID# , #BLOG_POST_ID# , #BLOG_ID# . Причем, доступны только в письмах тех рассылок, в которых триггер указан в качестве условия запуска.

Но чтобы эти теги показывались в списке тегов, нужно добавить их описание:

В скором времени можно будет указать свои поля в результате функции getRecipient, но сейчас это еще не доступно, как и свои поля в коннекторах адресов.

3.5. Фильтрация по сайту При создании/редактировании рассылки обязательно задается привязка к сайту. Вы можете получить код сайта методом getSiteId()

И уже использовать для сравнения с кодом сайта из события, или выбрав из базы привязку к сайту, или текущим сайтом(с константой SITE_ID).

4. Триггер для ненаступивших событий Ну хорошо, со срабатыванием триггера по событию разобрались. А как быть, если нет события? К примеру, не заходил на сайт 30 дней? Или бросил корзину 7 дней назад?Только по прошествии времени мы узнаем, что у нас какой-то период времени что-то не происходит:нет оформления заказа, нет захода на сайт.

На этот случай у нас есть другой тип триггера.Он запускается раз в день, в указанное время. И ему не нужно событие.

Допустим, у нас есть задача: запускать рассылку с купонами на скидку всем, кто накануне просмотрели товары.Создадим свой триггер, отнаследовавшись уже от другого класса:\Bitrix\Sender\TriggerConnectorClosed

и определим логику в методе filter():

Здесь мы фильтруем список просмотров по дате просмотра за период в один день.От текущего дня отнимаем указанное количество дней.Таким образом, если у нас указано в настройках триггера 1 день,то фильтр по дате на момент запуска будет выбирать записи за предыдущий день.И так каждый день.

Если нам нужна возможность обработать старые данные, то есть отправить письма не только "за вчера", но еще один раз отправить по всем пользователям, кто просматривал ранее, тосообщим, что триггер такое умеет делать:

5. Делаем готовую рассылку

Готовая рассылка - это набор писем и настроек.Из готовой рассылки можно создать на сайте рассылку.Если у вас есть полезная рассылка, которая пригодится и на других сайтах, то можно сделать готовую рассылку.Она будет всегда доступна как шаблон

Нужно сделать обработчик события OnPresetMailingList, в котором вернуть массив, описывающий рассылку.Ключи массива:TYPE - название раздела готовых рассылок при показе.CODE - уникальный символьный код рассылкиDESC - описание для пользователя в админке, показывается в списке готовых рассылокNAME - название рассылкиDESC_USER - описание для получателя, которое выведется при отпискеCHAIN - массив, описывающий письма TIME_SHIFT - через сколько отправить письмо в минутах SUBJECT - тема письма MESSAGE - тело письма, может содержать html, теги персонализации, php-код

TRIGGER - массив, описывающий триггер запуска и его настройки, триггер цели и его настройки. MODULE_ID - модуль триггера. Триггер становится доступным для использования, если название его класса сообщается в обработчике OnTriggerList. Если обработчик OnTriggerList установлен функцией AddEventHandler, то MODULE_ID не указывается. Если функцией RegisterModuleDependences - то в MODULE_ID указывается тот же модуль. CODE - код триггера, обязателен для указания FIELDS - массив предустановленных настроек триггера

Далее пример рассылки из трех писем, отправляемых через сутки каждое.Запускается по нашему новому триггеру просмотренных товаров.Целью является оплата заказа. Так как триггер находится в модуле sale, то модуль будет указан.

Данный код можно добавить в файл /bitrix/php_interface/init.php и готовая рассылка появится в списке.Перед выводом готовой рассылки в списке, проверяется зарегистрированы ли указанные триггеры.Если не зарегистрированы, то готовая рассылка не будет показана.

6. Итоги. Теперь вы знаете как создать свои триггеры, как собрать готовую рассылку.Расскажите, что вам не хватает в них.

📎📎📎📎📎📎📎📎📎📎