infotech/yii-message-renderer
Composer 安装命令:
composer require infotech/yii-message-renderer
包简介
Message rendering component for Yii 1.1
README 文档
README
Практически в каждом продукте требуется функционал отправки сообщений (email, sms и т.п.) на основании пользовательских шаблонов.
Эта библиотека предоставляет концептуальное решение задач, связанных с шаблонизацией сообщений, таких как:
- определение контекста отрисовки сообщения (определяющего набор подстановок и порядок их извлечения из моделей или результата запроса к БД);
- собственно отрисовку сообщения (наполнение шаблона данными);
- вывод помощи по подстановкам;
- потоковую отрисовку большого количества сообщений (с использованием
CDataProviderIterator).
Использование
Чтобы подключить библиотеку к продукту запросим его через composer
php composer.phar require infotech/yii-message-renderer
Ключевым элементом является компонент приложения MessageRendererComponent.
Для использования компонента необходимо подключить его в конфигурации приложения:
... 'components' => array( 'messageRenderer' => array( 'class' => 'Infotech\MessageRenderer\MessageRendererComponent', 'contexts' => [ 'SomeMessageContext', 'AnotherMessageContext', ] ), ... ), ...
где SomeMessageContext и AnotherMessageContext имена классов контекстов отрисовки сообщений,
о которых расскажем чуть ниже.
Теперь для отрисовки одного сообщения достаточно написать
Yii::app()->messageRenderer->render($contextType, $templateStringOrArray, $data);
а для отрисовки множества сообщений нужно использовать
foreach (Yii::app()->messageRenderer->renderBatch($contextType, $templateStringOrArray, $dataProvider) as $message) { // тип данных $message зависит от реализации метода `renderTemplate()` контекста }
Контекст отрисовки сообщений
Каждый класс контекста отрисовки сообщений является производным от абстрактного
Infotech\MessageRenderer\MessageContext и определяет состав подстановок и способ извлечения
данных.
В интерфейсе класса контекста есть метод renderTemplate($templateStringOrArray, $data), который
принимает строку шаблона (или массив шаблонных строк) и данные для наполнения шаблона,
а возвращяет отрисованную строку (или такой же массив отрисованных строк с теми же ключами).
Приведем пример класса контекста. Предположим у нас есть модель User, а также Task с
отношениями "assignee" (BELONGS_TO к User) и "reporter" (BELONGS_TO к User).
class TaskMessageContext extends \Infotech\MessageRenderer\MessageContext { public function placeholdersConfig() { return array( '_НОМЕР_ЗАДАЧИ_' => array( 'title' => 'Номер задачи', 'description' => 'Номер задачи. Например, "#142"', 'fetcher' => function (Task $task) { return '#' . $task->id; }, ), '_СТАТУС_ЗАДАЧИ_' => array( 'title' => 'Статус задачи', 'description' => 'Статус задачи. Например, "выполняется"', 'fetcher' => 'statusName', ), '_ТЕМА_ЗАДАЧИ_' => array( 'title' => 'Тема задачи', 'description' => 'Тема задачи. Например, "Увеличить логотип на главной странице"', 'fetcher' => 'subject', ), '_ИМЯ_ИСПОЛНИТЕЛЯ_' => array( 'title' => 'Имя исполнителя', 'description' => 'Имя сотрудника, на которого назначена задача (в именительном падеже). Например, "Василий Кузнецов"', 'fetcher' => 'assignee.full_name', 'empty' => '(не назначен)', ), '_ИМЯ_ПОЛЬЗОВАТЕЛЯ_' => array( 'title' => 'Имя пользователя', 'description' => 'Имя сотрудника, выполняющего действие над задачей (в именительном падеже). Например, "Константин Отрубов"', 'fetcher' => function () { return Yii::app()->getUser()->getModel()->fullName; }, ), '_ПОЧТА_ПОЛЬЗОВАТЕЛЯ_' => array( 'title' => 'E-mail пользователя', 'description' => 'E-mail сотрудника, выполняющего действие над задачей. Например, "otrubov@example.com"', 'fetcher' => function () { return Yii::app()->getUser()->getModel()->email; }, ), ); } public function getType() { return 'task'; } public function getName() { return 'Задачи'; } }
Ну забудем зарегистрировать контекст в конфигурации компонента.
Теперь, чтобы отправить email уведомление об изменении статуса задачи напишем
$task = ...; // задача, изменившая статус // достали шаблон из БД или иного источника $template = array( 'message' => '_ИМЯ_ПОЛЬЗОВАТЕЛЯ_ перевел задачу в статус "_СТАТУС_ЗАДАЧИ_"', 'subject' => 'Изменение статуса задачи №_НОМЕР_ЗАДАЧИ_', 'from' => 'notifier@example.com', 'to' => '_ПОЧТА_ПОЛЬЗОВАТЕЛЯ_', ); $emailData = Yii::app()->messageRenderer->render('task_issue', $template, $task); Yii::app()->mailer->send($emailData['message'], $emailData['subject'], $emailData['to'], $emailData['from']);
а для групповой отправки, пишем
$tasks = ...; // Traversable с задачами, изменившими статус // достали шаблон из БД или иного источника $template = array( 'message' => '_ИМЯ_ПОЛЬЗОВАТЕЛЯ_ перевел задачу в статус "_СТАТУС_ЗАДАЧИ_"', 'subject' => 'Изменение статуса задачи №_НОМЕР_ЗАДАЧИ_', 'from' => 'notifier@example.com', 'to' => '_ПОЧТА_ПОЛЬЗОВАТЕЛЯ_', ); $messagesIterator = Yii::app()->messageRenderer->renderBatch('task_issue', $template, $tasks); foreach ($messagesIterator as $emailData) { if ($emailData['to']) { Yii::app()->mailer->send($emailData['message'], $emailData['subject'], $emailData['to'], $emailData['from']); } }
infotech/yii-message-renderer 适用场景与选型建议
infotech/yii-message-renderer 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 13.25k 次下载、GitHub Stars 达 3, 最近一次更新时间为 2016 年 03 月 30 日, 在 PHP 生态内属于活跃度较高的组件。
我们在过去多个企业项目中使用过 infotech/yii-message-renderer 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 infotech/yii-message-renderer 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
统计信息
- 总下载量: 13.25k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 3
- 点击次数: 14
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2016-03-30