[ELMA3] Создание собственной функции для шаблонов оповещений
В статье приведен пример создания собственной функции для оповещений. Рассмотренная в примере функция выполняет генерацию разметки и подставляет значения даты начала и окончания. О том, какие существуют системные функции и как их использовать в шаблонах оповещений можно прочитать в следующей статье.
Пример отображения данных
Рис. 1. Значение функции Period в оповещении при создании задачи
Пример класса точки расширения
FormatedValue – это форматируемое значение Вашей функции.
FunctionEvaluationContext – это параметры для вычисления Вашей функции. Количество параметров может быть неограниченно. В функции параметры отделяются друг от друга точкой запятой, например, {Period({$New.StartDate};{$New.EndDate};SR(’Период’))} , где {$New.StartDate}, {$New.EndDate} и SR(’Период’) являются параметрами. Для того, чтобы получить значение нужного параметра, необходимо ссылаться на номер его позиции. Если обратиться к вышеописанному примеру, то параметр {$New.StartDate} имеет порядковый номер равный 0, {$New.EndDate} является номером 1 и так далее. Чтобы записать значение параметра необходимо привести его к правильному формату, в этом поможет функция context.GenerationContext.FormatProvider.FormatValue(context.Parameters[Номер_Позиции_Параметра]). Необходимость приведения к правильному формату обусловлена тем, что в значении переменной могут находится лишние символы, например, при передаче даты окончания пользовательской задачи без времени (дд.мм.гггг) без использования приведения к верному формату в оповещении будет дата начала равная дд.мм.гггг 23:59:50, а если использовать приведение, то дата запишется в верном формате.
Название функции будет совпадать с названием метода Вашего класса, реализующего функцию для шаблона оповещения. В данном примере использование функции в оповещении будет выглядеть следующим образом: {Period({$New.StartDate};{$New.EndDate};SR(’Период’))}, причем параметр под номером 3 является необязательным, так как название поля будет сгенерировано по умолчанию Срок выполнения.
[Component] public class MyNotificationFunction : INotificationFunctions { /// <summary> /// Генерирует строку, состоящую из имени свойства и значений двух дат. /// Параметр 1 - Значение 1 (Дата начала). /// Параметр 2 - Значение 2 (Дата окончания). /// Параметр 3 - Заголовок (необязательный), по умолчанию генерируется название "Срок выполнения". /// </summary> public static FormatedValue Period(FunctionEvaluationContext context) { string captionFinish = SR.T("Срок выполнения"); if (context.Parameters.Count < 2) return new FormatedValue(string.Empty); //Значение первого параметра (Дата начала) var startDateValue = context.Parameters[0]; //Отформатированное строковое значение Даты начала var startDateFormatedValue = context.GenerationContext.FormatProvider.FormatValue(startDateValue); //Значение второго параметра (Дата окончания) var endDateValue = context.Parameters[1]; //Отформатированное строковое значение Даты окончания var endDateFormatedValue = context.GenerationContext.FormatProvider.FormatValue(endDateValue); //Формируем текст значений оповещения var formattedValue = SR.T("с {0} до {1}", startDateFormatedValue, endDateFormatedValue); if (context.Parameters.Count == 3) { //Формируем название поля var caption = context.Parameters[2]; var captionFormatedValue = context.GenerationContext.FormatProvider.FormatValue(caption); captionFinish = captionFormatedValue; } //Генерируем разметку return new FormatedValue(string.Format("{0} {1}", captionFinish, formattedValue)); } }
Создание собственной функции генератора шаблонов оповещений
Реализация ITemplateGeneratorFunctionsContainer аналогична реализации INotificationFunctions. В данном примере реализована функция PriorityHight, которая возвращает true, если задача имеет приоритет Высокий. Отличие данных точек расширения в том, что INotificationFunctions используются для отображения в разметке, тогда как ITemplateGeneratorFunctionsContainer используются в условиях фильтраций Condition.
Пример:
<Filter> <Condition> (PriorityHight({$New}) = true) </Condition> </Filter>
Пример класса точки расширения
[Component] public class TemplateGenerator : ITemplateGeneratorFunctionsContainer { public static FormatedValue PriorityHight(FunctionEvaluationContext context) { var result = false; if (context != null && context.Parameters != null && context.Parameters.Count > 0) { var ctxParam = context.Parameters[0]; if (ctxParam != null && ctxParam.Value is ITaskBase) { var task = (ITaskBase)ctxParam.Value; if (task.Priority == TaskPriority.High) result = true; } } return new FormatedValue(result); } }
Данную функцию можно добавить в уже существующий шаблон оповещений Tasks.Task.xml в <Notification Name="Create">. В данном шаблоне уже существует условие, при котором оповещение отправится получателям, но если добавить and (PriorityHight({$New}) = true) – тогда будут отправляться оповещения при создании задачи, если её приоритет высокий.
Ссылки на элементы API
- INotificationFunctions (для версий 3.13, 3.15, 4.0);
- ITemplateGeneratorFunctionsContainer (для версий 3.13, 3.15, 4.0).