Y
Y
Yakov Kravtsov2021-08-27 14:43:26
1C-Bitrix
Yakov Kravtsov, 2021-08-27 14:43:26

How to make a trigger in a trigger mailing?

Добрый день!

Как правильно сделать триггер для триггерной рассылки в битриксе, который будет запускаться не по событию, а сам, периодически?

Я так понимаю, нужно унаследоваться от TriggerConnectorClosed и определить метод filter.
Официальной документации нет, примеров тоже нет, есть пару статей в интернете, который прочитал вдоль и поперек.

Суть в том, что не запускается триггер! Хоть ты тресни! Отлаживать очень сложно, так как по времени должен быть запуск.

По агентам не работает, по крону не работает.

Работают лишь только те триггеры, которые запускаются по событию.

Что делать?

Answer the question

In order to leave comments, you need to log in

1 answer(s)
G
Ge1i0N, 2021-08-28
@Ge1i0N

Есть хорошая статья на эту тему. Немного устарела, но суть осталась прежняя: https://dev.1c-bitrix.ru/community/blogs/silaev/ma...

Отлаживать очень сложно, так как по времени должен быть запуск

Если триггер активирован - он создаёт агента.
Можно либо править время запуска агента, либо вызывать его код запуска руками.
Ниже привожу обрезанный код работающего триггера с проекта.
Вешаете на событие обработчик:
AddEventHandler("sender",  "OnTriggerList",  ["EventListener", "onTriggerList"]);

Затем вызываете ваш триггер:
use Bitrix\Main\Event;

class EventListener
{
 public static function OnTriggerList(Event $event): Event
    {
        Handlers\Sender\MyTrigger::addTriggerInList($event);

        return $event;
    }
 }

Код обработчика примерно такой:
namespace  Handlers\Sender;

use Bitrix\Main\Event;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\EventResult;
use Bitrix\Sender\Trigger\TriggerConnectorClosed;

Loc::loadMessages(__FILE__);

Loader::includeModule('sender');

class MyTrigger extends TriggerConnectorClosed
{
    public static function addTriggerInList(Event &$event): Event
    {
        $event->addResult(new EventResult(0, [
            'TRIGGER' => [
                'Handlers\Sender\MyTrigger' 
            ]
        ]));

        return $event;
    }

    public function getName(): string
    {
        return 'TriggerName';
    }

    public function getCode(): string
    {
        return 'my_trigger';
    }

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

    public function filter(): bool
    {
        $this->recipient = [];

        //  Тут какая-то логика на поиск людей по нужным параметрам

        $this->recipient[] = [
             'EMAIL' => $user['EMAIL'],
             'NAME' => $user['NAME'],
             'USER_ID' =>  $user['ID'],
        ];
  
        if (!empty($this->recipient)) {
            return true;
        } else {
            return false;
        }
    }

    public function getForm(): string
    {
        return ' '; // Тут форма с параметрами которые можно выбирать при создании триггера, если нужно.
    }

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

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

Главное учтите, что если триггер будет запускаться через Cron, а в его коде есть какие-то методы и классы которые подключаются через composer, то путь к автолоадеру должен быть прописан абсолютный, а не через $_SERVER["DOCUMENT_ROOT"] - иначе не будет отрабатывать триггер.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question