NVelocity (или Velocity) как автономный оценщик формул - PullRequest
1 голос
/ 14 мая 2010

Я использую NVelocity в своем приложении для генерации html-писем. У моего приложения есть модель, управляемая событиями, где сохранение и / или обновление объектов приводит к отправке этих электронных писем. Каждое событие может вызвать ноль, одно или несколько сообщений электронной почты.

Я хочу иметь возможность настроить, какие электронные письма будут отправляться во время выполнения, без необходимости изменения кода. Я думал, что мог бы использовать директиву NVelocity #if (), чтобы сделать это. Вот моя идея ...

Шаг 1) Перед отправкой электронной почты администратор должен настроить формулу для оценки NVelocity. Например:

$User.FirstName == "Jack"

Шаг 2) Когда объект сохранен или создан, создайте шаблон NVelocity в памяти на основе формулы ввода. Например:

String formula = GetFormulaFromDB(); // $User.FirstName == "Jack"
String templ = "#if( " + formula + ") 1 #else 0 #end";

Шаг 3) Запустите движок NVelocity в памяти для шаблона. Проверьте результаты, чтобы увидеть, если мы должны отправить электронное письмо:

String result = VelocityMerge(templ); // utility function 
if( result.Trim() == "1" )
{
    SendEmail();
}

Я знаю, что это не совсем то, для чего предназначалась NVelocity, но я думаю, что это может сработать :) Одно из преимуществ такой работы заключается в том, что для формулы можно использовать тот же синтаксис, что и внутри шаблон.

Есть ли у кого-нибудь слова предостережения или предложения? Есть ли способ выполнить директиву #if (), не перепрыгивая через обручи, как у меня выше? Есть ли рекомендуемый способ заблаговременной проверки синтаксиса формулы?

Спасибо.

1 Ответ

1 голос
/ 14 мая 2010

Если нетехнический конечный пользователь - тот, кто меняет критерии, я был бы очень осторожен, чтобы проверить его ввод. Вы можете легко проверить его, запустив шаблон (т. Е. Ваш метод VelocityMerge()) для ввода, если NVelocity пожалуется, что вы отклоните ввод, в противном случае сохраните его в базе данных.

Другое ограничение заключается в том, что вам необходимо заранее знать все переменные, которые могут присутствовать в критериях, как прокомментировал serg555. Некоторому почтовому шаблону может потребоваться переменная, которая не нужна другим письмам, но вам все равно придется сделать ее доступной для всех шаблонов. Является ли это реальным ограничением или нет, зависит от однородности (?) Ваших почтовых шаблонов.

Также конечный пользователь, который определяет критерии, должен был бы знать все доступные переменные (например, $User) и свойства каждой переменной (например, FirstName, LastName и т. Д.). Возможно, экран справки со списком их.

...