PHPackages                             infotech/yii-message-renderer - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Templating &amp; Views](/categories/templating)
4. /
5. infotech/yii-message-renderer

ActiveLibrary[Templating &amp; Views](/categories/templating)

infotech/yii-message-renderer
=============================

Message rendering component for Yii 1.1

v1.1.1(8y ago)312.6k↓34.6%MITPHP

Since Mar 30Pushed 8y ago2 watchersCompare

[ Source](https://github.com/infotech-ru/yii-message-renderer)[ Packagist](https://packagist.org/packages/infotech/yii-message-renderer)[ RSS](/packages/infotech-yii-message-renderer/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (3)Versions (11)Used By (0)

Шаблонизация сообщений
======================

[](#шаблонизация-сообщений)

Практически в каждом продукте требуется функционал отправки сообщений (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']);
    }
}
```

###  Health Score

35

—

LowBetter than 80% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity28

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity69

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~46 days

Recently: every ~102 days

Total

10

Last Release

3282d ago

Major Versions

v0.4.0 → v1.0.02016-07-27

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/7007332?v=4)[ashustov](/maintainers/ashustov)[@ashustov](https://github.com/ashustov)

---

Top Contributors

[![AntonTyutin](https://avatars.githubusercontent.com/u/548575?v=4)](https://github.com/AntonTyutin "AntonTyutin (12 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/infotech-yii-message-renderer/health.svg)

```
[![Health](https://phpackages.com/badges/infotech-yii-message-renderer/health.svg)](https://phpackages.com/packages/infotech-yii-message-renderer)
```

###  Alternatives

[roots/acorn

Framework for Roots WordPress projects built with Laravel components.

9682.1M97](/packages/roots-acorn)[whitecube/nova-flexible-content

Flexible Content &amp; Repeater Fields for Laravel Nova.

8053.0M25](/packages/whitecube-nova-flexible-content)[mopa/bootstrap-bundle

Easy integration of twitters bootstrap into symfony2

7042.9M33](/packages/mopa-bootstrap-bundle)[limenius/react-bundle

Client and Server-side react rendering in a Symfony Bundle

3871.2M](/packages/limenius-react-bundle)[nicmart/string-template

StringTemplate is a very simple string template engine for php. I've written it to have a thing like sprintf, but with named and nested substutions.

2101.7M30](/packages/nicmart-string-template)[symfony/ux-icons

Renders local and remote SVG icons in your Twig templates.

555.8M69](/packages/symfony-ux-icons)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
