proklung/bitrix.notifier.module

将 Symfony Notifier 组件集成到 Bitrix

安装: 2

依赖: 0

建议者: 0

安全: 0

星标: 3

关注者: 1

分支: 0

开放问题: 0

类型:bitrix-d7-module

1.31 2022-01-14 17:19 UTC

This package is auto-updated.

Last update: 2024-09-15 00:05:16 UTC


README

原始组件的文档。总体上,模块遵循原始组件的布局。主要区别在于服务的配置方式(不是 Yaml,而是 Bitrix 的数组配置)。

安装

主要项目的 composer.json

  "extra": {
    "installer-paths": {
      "./bitrix/modules/{$name}/": ["type:bitrix-d7-module", "type:bitrix-module"],
      "./bitrix/components/{$name}/": ["type:bitrix-d7-component", "type:bitrix-component"],
      "./bitrix/templates/{$name}/": ["type:bitrix-d7-template", "type:bitrix-theme"]
    }
  }

    "repositories": [
        {
            "type": "git",
            "url": "https://github.com/proklung/bitrix.notifier.module"
        },
        {
          "type": "git",
          "url": "https://github.com/proklung/bitrix.containerable.boilerplate"
        }
    ]
$ composer require proklung/bitrix-notifier-module

在网站的行政界面中安装模块 proklung.notifier,在 bitrix/admin/partner_modules.php

将以下代码添加到您的 init.php

use Bitrix\Main\Loader;

Loader::includeModule('proklung.notifier');

使用(简单示例)

向 Telegram 聊天发送消息

use Symfony\Component\Notifier\Message\ChatMessage;

$container = \Proklung\Notifier\DI\Services::boot();
$chatter = $container->get('chatter');

$notification = (new ChatMessage('Hi from module'));
$chatter->send($notification);

发送 SMS(假设已配置相应传输)

use Symfony\Component\Notifier\Message\SmsMessage;

$container = \Proklung\Notifier\DI\Services::boot();
$texter = $container->get('texter');
$sms = new SmsMessage(
            '+79263622508',
            'Тестирование!'
        );

$sentMessage = $texter->send($sms);

发送电子邮件(注意:现在所有设置均针对通过 Gmail 发送;未测试 SMTP)

use Symfony\Component\Notifier\Notification\Notification;
use Symfony\Component\Notifier\Recipient\Recipient;

$notifier = \Proklung\Notifier\DI\Services::getInstance()->get('notifier');
$notification = (new Notification('New Invoice', ['email']))
                ->content('You got a new invoice for 15 EUR.');

$recipient = new Recipient(
            'email_customer@gmail.com',
            '+71111111'
        );

$notifier->send($notification, $recipient);

依赖关系

模块没有多余的依赖。仅包含 Symfony Mailer。需要的传输可以单独获取。

例如,如果需要发送 Telegram 消息,则需要安装包 symfony/telegram-notifier。因为它“标准”,所以会自动获取。

如果需要连接自定义传输,则通过 /bitrix/.settings.php 进行操作(见下文)。

配置文件

配置与父包相同。通过编辑文件 bitrix/.settings.php 进行设置。

proklung.notifier 部分

return [
// ....
  'proklung.notifier' => [
          'value' => [
              'notifier' => [
                  // https://symfony.com.cn/doc/current/notifier.html#configuring-channel-policies
                 'channel_policy' => [
                     'high' => ['chat'],
                     'medium' => ['email']
                  ],
                  'chatter_transports' => [
                      'telegram' => 'telegram://315114113:AAFjvQlEiaWisZsav_YQfwmhEIIP9PFw3Ss@default?channel=-1001595706876',
                  ],
                  'texter_transports' => [
                      'smstraffic' => 'smstraffic://mosfond1:pnLag4yN@default?from=MFC',
                  ],
              ],
              'parameters' => [
                  'cache_path' => '/bitrix/cache/s1/proklung.notifier', // Путь к закешированному контейнеру
                  'container.dumper.inline_factories' => false, // Дампить контейнер как одиночные файлы
                  'compile_container_envs' => ['prod'], // Окружения при которых компилировать контейнер
              ],
              'services' => [
                  // Дополнительный кастомный транспорт.
                  // Сервисы инстанцируются без auto-wiring
                  'smstraffic.factory' =>
                      [
                          'class' => 'Prokl\Component\Notifier\Bridge\SmsTraffic\SmsTrafficTransportFactory',
                          'tags' => ['name' => 'texter.transport_factory'],
                      ],
              ],
              'mailer' => [
                      'enabled' => true,
                      'dsn' => 'gmail+smtp://robotivanov2020:izjqfjyegwmznrtb@default',
                      'envelope' => [
                          // Получатель писем  
                          'recipients' => ['testing@mail.ru'],
                           // Поле from отправляемого письма 
                          'sender' => 'sender@gmail.com',  // Важный параметр, если иметь дело с почтой.
                  ],
              ],
              // Конфигурация Твига (для генерации писем)  
              'twig' => [
                  'cache_dir' => $_SERVER['DOCUMENT_ROOT'] . '/bitrix/cache/twig',
                  'config' => [],
                  'paths' => [$_SERVER['DOCUMENT_ROOT'] . '/'],
              ],
          ],
      ]
];

参数支持诸如 '%env(TELEGRAM_DSN)%'(对 TELEGRAM_DSN 环境变量的引用)之类的功能。

容器缓存

cache_path 参数 - 指向编译后的容器存放的路径。如果未设置,则默认为 /bitrix/cache/s1/proklung.redis

假设系统中已安装环境变量 DEBUG$_ENV 数组中。如果没有,则默认假定环境为“调试”。

compile_container_envs 参数(数组)指示需要缓存容器的环境。

目前的简单逻辑:如果 $_ENV["DEBUG"] === true,则环境为 dev,否则为 prod

其他

FlashBag

用于处理发送到 browser 通道。两种选择

  • 公共服务 session_instance 将返回会话实例,其中包含 getFlashBag 方法。
  • 助手 \Proklung\Notifier\DI\Services::getFlashBag() 做同样的事情。

使用 Bitrix 邮件事件及其模板

        use Proklung\Notifier\Bitrix\Sender\BitrixMailEventSender;

        $bitrixEventHandler = BitrixMailEventSender::getInstance(
            \Proklung\Notifier\DI\Services::getInstance()->get('notifier')
        );
    
        // Или так:
        $bitrixEventHandler = \Proklung\Notifier\DI\Services::get('bitrix.notifier.mail');

        // Массив, идентичный с параметром fields при отправке Битриксом сообщений
        // См. https://dev.1c-bitrix.ru/api_help/main/reference/cevent/send.php 
        $arFields = ['NAME' => 'testing email', 'EMAIL' => 'recipitient@gmail.com'];

        // Будет оправлено сообщение в канал email и сделана запись в таблице b_event.
        $bitrixEventHandler->send('CODE_MAIL_EVENT', $arFields);

发送失败不会静默处理。如果出现问题,则会抛出异常。

根据 channel_policy 发送 Bitrix 事件

条件 channel_policy/bitrix/,settings.php

                'channel_policy' => [
                    //...
                    'medium' => ['email', 'chat/telegram'],
                    //...
                ],
        use Proklung\Notifier\Bitrix\Sender\BitrixPolicySender;
        use Symfony\Component\Notifier\Notification\Notification;;
    
        /** @var BitrixPolicySender $bitrixEventHandler */ 
        $bitrixEventHandler = BitrixPolicySender::getInstance(
                    \Proklung\Notifier\DI\Services::getInstance()->get('notifier')
        );
       
        // Или так:
        $bitrixEventHandler = \Proklung\Notifier\DI\Services::get('bitrix.notifier.policy');

        // Массив, идентичный с параметром fields при отправке Битриксом сообщений
        // См. https://dev.1c-bitrix.ru/api_help/main/reference/cevent/send.php 
        $arFields = ['NAME' => 'testing email', 'EMAIL' => 'recipitient@gmail.com'];

        // Будет оправлено сообщение в канал email и telegram, а также сделана запись в таблице b_event.
        $bitrixEventHandler->send('CODE_MAIL_EVENT', $arFields, Notification::IMPORTANCE_MEDIUM);

使用 Bitrix SMS 事件及其模板

        use Proklung\Notifier\Bitrix\Sender\BitrixSmsSender;

        $bitrixEventHandler = BitrixSmsSender::getInstance(
            \Proklung\Notifier\DI\Services::getInstance()->get('texter')
        );
        
        // Или так:
        $bitrixEventHandler = \Proklung\Notifier\DI\Services::get('bitrix.notifier.sms');

        // Массив, идентичный с параметром fields при отправке Битриксом сообщений
        $arFields = [
                'SENDER' => 'test', 'RECEIVER' => '+7926111111', 
                'USER_PHONE' => '+7926111111', 'CODE' => '123'
        ];

        // Будет оправлено SMS и сделана запись в таблице b_event.
        $bitrixEventHandler->send('SMS_USER_RESTORE_PASSWORD', $arFields);

发送失败会被静默处理。如果发送 SMS 时出现问题,则不会有任何提示,但会在 b_event 表中生成一个带有失败标志和错误文本的记录。

将 Bitrix 邮件模板发送到 Telegram

        use Proklung\Notifier\Bitrix\Sender\BitrixTelegramEventSender;

        $bitrixEventHandler = BitrixTelegramEventSender::getInstance(
            \Proklung\Notifier\DI\Services::getInstance()->get('chatter')
        );

        // Или так:
        $bitrixEventHandler = \Proklung\Notifier\DI\Services::get('bitrix.notifier.telegram');


        $arFields = ['CODE' => '2222', 'LINK' => 'http://site.loc/'];

        $bitrixEventHandler->send('TEST_EVENT', $arFields);

必须安装 symfony/telegram-notifier 并在 /bitrix/.settings.php 文件的 chatter_transports 部分注册传输 telegram

注意事项

  • Telegram 很难处理 html(即使在 parse_mode = html 模式下)。因此,在底层,html 模板将转换为 markdown 格式。