virus_forever
@virus_forever

Как правильно сделать триггер в для триггерной рассылки?

Добрый день!

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

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

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

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

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

Что делать?
  • Вопрос задан
  • 423 просмотра
Пригласить эксперта
Ответы на вопрос 1
Ge1i0N
@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"] - иначе не будет отрабатывать триггер.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы