是否可以通过 Play!模板作为变量?

Is it possible to pass in a Play! Template as a variable?

我正在使用 Play,我有一个简单的 EmailService class,它在 Play 模板中呈现一些对象。这是我的代码:

Content html = views.html.acceptedEmail.render(incomingBlob,relatedBlob,rule);
      email = new Email().setFrom("noreply@company.com")
          .setTo(rule.getSuccessEmailValues())
          .setSubject(rule.getFailureNotificationSubject())
          .setBodyHtml(html.toString());

我想知道是否可以将 acceptedEmail 模板作为变量值传递,以便我正在应用的模板可以根据我传递给 EmailService (Java) class 此代码的来源的值动态更改。

我是 Scala 模板的新手,所以如果问题有点大或需要更多信息,我深表歉意。

更新

这就是我希望这段代码的最终工作方式:

String template = object.getTemplateName();

Content html = views.html."template".render(incomingBlob,relatedBlob,rule);

显然没有引号,但希望你明白我的意思。

是的,你可以。 Play 中的模板使用模板源文件生成等效的 scala class。使用您为模板声明的参数将 class 的对象传递给渲染引擎,导致文本被渲染。

据我所知,这不是(完全)可以玩的!将所有模板编译为 views.html.* package/namespace 下的静态 (Scala) 对象。您也许可以通过使用 Java 的 Refection API 来实现您想要的,但老实说,我认为这不值得花时间,并且 [=25 可能存在未知问题=] Scala 编译时最终会生成的对象。

我怀疑您需要呈现的模板数量肯定是有限的(因为它们必须编译并且不能在运行时添加)所以您最安全的选择是详细检查您的条件,然后选择合适的模板即:

Content content;
if(template == "acceptedEmail")
    content = views.html.acceptedEmail.render(incomingBlob,relatedBlob,rule)
else if (template == "somethingElse")
    content = views.html.somethingElse.render(incomingBlob,relatedBlob,rule)
.....

或者您可以在视图级别执行此操作:

//controller
Content content = views.html.mainView.render(template,incomingBlob,relatedBlob,rule);

//view - mainView.scala.html
@(template: String, incomingBlob: ?,relatedBlob: ?,rule: ?))

@if(template == "acceptedEmail") {
    @acceptedEmail(incomingBlob, relatedBlob, rule)
}

无论如何,使用 play 的模板实现这不是一件小事,因此使用另一个模板库可能会更好,因为这仅用于电子邮件(也许 Handlebars Java?)。