Шаблонизатор — это механизм формирования текста по заранее заданному шаблону, в котором специальные метки и команды заменяются данными из системы.
В Timetta шаблонизатор на базе Scriban используется для подстановки данных в текст с помощью конструкций {{ ... }} и {% ... %}: например, {{ Name }} заменяется на название проекта, а {% for ... %} позволяет вывести список связанных записей. Он применяется в моделях контекста ИИ, шаблонах электронной почты и документах проекта.
В системе шаблонизатор подключен в трех компонентах:
Во всех случаях это подстановка данных в текст по шаблону с {{ ... }} и {% ... %}, но контекст и загрузка данных разные.
| Тип контекста | Данные в шаблоне | Особенности / Корневая сущность |
|---|---|---|
| Схемы контекста ИИ | Одна сущность типа представления, например Project, Deal: {{ Name }}, {{ Manager.Name }}, циклы по коллекциям |
Корень — одна бизнес-сущность: Project, Deal и т. п. |
| Шаблоны электронной почты | Фиксированные объекты: Organization, Contact, Deal, Performer Примеры: {{ Contact.FirstName }}, {{ Organization.Name }} |
Нет единого корня — используются несколько независимых объектов |
| Документы проекта | Сам документ (ProjectArtifact) как корень — аналогично схемам контекста ИИ |
Корень — ProjectArtifact; используются те же правила, что и для схем ИИ |
| Вид | Как выглядит | Зачем |
|---|---|---|
| Обычный текст | Все без {{ и {% |
Попадает в результат как есть, включая Markdown |
| Метки и команды | {{ ... }} и {% ... %} |
Подстановка значений, циклы, условия |
Пример:
Проект: {{ Name }}
Код: {{ Code }}
В результате {{ Name }} заменится на название проекта, {{ Code }} — на код. Строка Проект: останется без изменений.
{{ ... }}Внутри {{ }} указывается поле записи или цепочка через точку для связанной записи:
{{ Name }}
{{ Code }}
{{ Description }}
{{ Manager.Name }}
{{ StartDate }}
{{ EndDate }}
Правила:
Name, не name;Manager.Name = имя менеджера;Если поля нет или оно пустое, на этом месте часто будет пусто.
{{- и -}}Иногда после метки или цикла остаются лишние пустые строки, особенно в таблицах Markdown. Символ - у скобок подрезает пробелы и переносы с этой стороны:
| Ресурс | Роль |
| :----- | :--- |
{{- for Member in ProjectTeamMembers }}
| {{ Member.Resource.Name }} | {{ Member.Role.Name }} |
{{- end }}
Без - между строками таблицы могут появиться лишние пустые ряды.
{% for ... %}Если у записи есть несколько связанных строк, один блок шаблона повторяется для каждого элемента:
{% for Member in ProjectTeamMembers %}
- {{ Member.Resource.Name }} - {{ Member.Role.Name }}
{% end %}
Смысл конструкции:
ProjectTeamMembers — имя списка у текущей записи, как в модели;Member — временное имя одного элемента внутри цикла, его можно назвать иначе, например Row;Member.Resource.Name.Тот же список в таблице:
| Сотрудник | Роль |
| :-------- | :--- |
{{- for Member in ProjectTeamMembers }}
| {{ Member.Resource.Name }} | {{ Member.Role.Name }} |
{{- end }}
Важно для Timetta: система по шаблону сама подгружает связанные данные, которые явно указаны в путях: Manager.Name, ProjectTeamMembers.Resource.Name и т. п. Поэтому в шаблоне лучше писать прямые обращения к полям, а не выдумывать обходные пути.
{% if %}{% if Description %}
## Описание
{{ Description }}
{% end %}
Блок между {% if %} и {% end %} попадет в текст только если Description заполнено.
Можно комбинировать условия с циклами и Markdown.
Шаблонизатор не мешает разметке Markdown. Можно использовать:
#, ##;- или 1.;| ... |;**...**, если он нужен в контексте.Итог — готовый текст для чата, удобный и человеку, и ИИ.
# Паспорт проекта
- Наименование: {{ Name }}
- Код: {{ Code }}
- Менеджер: {{ Manager.Name }}
- Сроки: {{ StartDate }} - {{ EndDate }}
## Описание
{{ Description }}
## Команда
| Ресурс | Роль |
| :----- | :--- |
{{- for Member in ProjectTeamMembers }}
| {{ Member.Resource.Name }} | {{ Member.Role.Name }} |
{{- end }}
Для нескольких выделенных записей в списке этот шаблон выполняется отдельно для каждой записи. Полученные блоки склеиваются с пустой строкой между ними.
Корень шаблона — одна выбранная сущность того типа, для которого настроена схема: проект, сделка, документ и т. д.
Полное описание сущностей и их свойств доступно в менеджере сущностей.
Доступно для применения:
Name, Code, StartDate и т. п.;Manager.Name, (в том числе по «цепочке») — Organization.Code);ProjectTeamMembers (их надо итерировать в цикле) и т. п.Имена должны совпадать со свойства в метамодели / карточке, как в API и настройках сущности. Если метка не совпадает, в результате будет пустое место или ошибка при генерации.
| Нельзя / не предусмотрено | Пояснение |
|---|---|
| Считать суммы и средние в шаблоне | Технически Scriban поддерживает выражения и вычисления, но в Timetta шаблон предназначен прежде всего для подстановки данных. Расчеты лучше выполнять в системе и передавать в шаблон готовыми полями. |
| Обращаться к чужому типу записи | Контекст — только выбранная сущность и ее связи |
| Использовать произвольные формулы | Доступны только поля модели и конструкции Scriban |
Расширенные возможности Scriban, например сложные функции и специальное форматирование дат, в справочнике Timetta почти не используются. Шаблон в Timetta ориентирован прежде всего на поля сущности и простые конструкции, как в примерах выше.
| Ситуация | Результат |
|---|---|
| Поле Текст шаблона пустое | Подставляется простая таблица по умолчанию: наименование, код, описание и другие доступные поля |
Опечатка в {{ / {%, незакрытый end |
Текст не сформируется; при сохранении шаблона появится ошибка |
| Неверное имя поля | В результате будет пустое место |
При создании схемы для типа с полем имени система может подставить минимальный шаблон: {{ Name }}.
Перейти на русскую версию?