[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 является необязательным, так как название поля будет сгенерировано по умолчанию Срок выполнения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | [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.
Пример:
1 2 3 4 5 | < Filter > < Condition > (PriorityHight({$New}) = true) </ Condition > </ Filter > |
Пример класса точки расширения
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | [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).