https://github.com/proklung/bitrix.notifier.module
Интеграция компонента Symfony Notifier в Битрикс
https://github.com/proklung/bitrix.notifier.module
bitrix bitrix-module bitrix-symfony notifications php php7
Last synced: 3 months ago
JSON representation
Интеграция компонента Symfony Notifier в Битрикс
- Host: GitHub
- URL: https://github.com/proklung/bitrix.notifier.module
- Owner: ProklUng
- Created: 2021-07-27T14:35:31.000Z (almost 4 years ago)
- Default Branch: master
- Last Pushed: 2022-01-14T17:20:02.000Z (over 3 years ago)
- Last Synced: 2024-12-25T21:24:15.530Z (4 months ago)
- Topics: bitrix, bitrix-module, bitrix-symfony, notifications, php, php7
- Language: PHP
- Homepage:
- Size: 110 KB
- Stars: 3
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: readme.MD
Awesome Lists containing this project
README
# Интеграция компонента Symfony Notifier в Битрикс
[Документация](https://symfony.com/doc/current/notifier.html) на оригинальный компонент.
В целом модуль следует канве оригинального компонента. Основное отличие - способ конфигурирования сервисов
(не Yaml, а битриксовые массивные конфиги).## Установка
composer.json основного проекта:
```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"]
}
}
```И:
```json
"repositories": [
{
"type": "git",
"url": "https://github.com/proklung/bitrix.notifier.module"
},
{
"type": "git",
"url": "https://github.com/proklung/bitrix.containerable.boilerplate"
}
]
``````bash
$ composer require proklung/bitrix-notifier-module
```Установите модуль `proklung.notifier` в административном интерфейсе сайта `bitrix/admin/partner_modules.php`
Добавьте следующий код в ваш `init.php`:
```php
use Bitrix\Main\Loader;Loader::includeModule('proklung.notifier');
```
### Использование (простейшие примеры)Отправить сообщение в чат Телеграма:
```php
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 (при условии, что соответствующий транспорт сконфигурирован):
```php
use Symfony\Component\Notifier\Message\SmsMessage;$container = \Proklung\Notifier\DI\Services::boot();
$texter = $container->get('texter');
$sms = new SmsMessage(
'+79263622508',
'Тестирование!'
);$sentMessage = $texter->send($sms);
```Отправить email (NB: сейчас все настроено под отправку через Gmail; SMTP не тестировал):
```php
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 protected]',
'+71111111'
);$notifier->send($notification, $recipient);
```### Зависимости
Модуль не отягощен лишними зависимостями. В комплекте идет только `Symfony Mailer`. Нужные транспорты подтягиваются
отдельно.Например, если нужна отправка сообщений в Телеграм, то ставится пакет `symfony/telegram-notifier`. Т.к. он "стандартный",
то подхватится автоматически.Если нужно зацепить кастомный транспорт, то это делается через `/bitrix/.settings.php` (смотри ниже).
## Конфигурационный файл
Конфигурация идентична родительскому пакету. Настройка производится посредством правки файлов `bitrix/.settings.php`
Секция `proklung.notifier`:
```php
return [
// ....
'proklung.notifier' => [
'value' => [
'notifier' => [
// https://symfony.com/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' => ['[email protected]'],
// Поле from отправляемого письма
'sender' => '[email protected]', // Важный параметр, если иметь дело с почтой.
],
],
// Конфигурация Твига (для генерации писем)
'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()`, делающий тоже самое.### Использование битриксовых почтовых событий и их шаблонов
```php
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' => '[email protected]'];// Будет оправлено сообщение в канал email и сделана запись в таблице b_event.
$bitrixEventHandler->send('CODE_MAIL_EVENT', $arFields);
```Ошибки отправки не глушатся. Если что-то пойдет не так, то выбросится исключение.
### Отправка битриксового события согласно channel_policy
При условии `channel_policy` в `/bitrix/,settings.php`:
```php
'channel_policy' => [
//...
'medium' => ['email', 'chat/telegram'],
//...
],
``````php
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' => '[email protected]'];// Будет оправлено сообщение в канал email и telegram, а также сделана запись в таблице b_event.
$bitrixEventHandler->send('CODE_MAIL_EVENT', $arFields, Notification::IMPORTANCE_MEDIUM);
```### Использование битриксовых SMS событий и их шаблонов
```php
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`
появится запись с признаком неудачи и текстом ошибки.### Отправка битриксовых почтовых шаблонов в Телеграм
```php
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` и зарегистрирован транспорт `telegram` в секции `chatter_transports`
файла `/bitrix/.settings.php`.Нюанс:
- Telegram плохо переваривает html (даже в режиме `parse_mode = html`). Посему под капотом html шаблона превращается в markdown
разметку.