0

我正在使用 Play,我有一个简单的 EmailService 类,可以在 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());

我想知道是否可以将接受的电子邮件模板作为变量值传递,以便我应用的模板可以根据我传递给该代码来自的 EmailService (Java) 类的值动态更改。

我对 Scala 模板还很陌生,所以如果问题有点过分或者需要更多信息,我深表歉意。

更新

这最终是我想让这段代码工作的方式:

String template = object.getTemplateName();

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

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

4

2 回答 2

1

据我所知,这不是(完全)可能的 Play!将所有模板编译为views.html.*包/命名空间下的静态 (Scala) 对象。您可能可以通过使用 Java 的 Refection API 来实现您想要的,但老实说,我认为这不值得花时间,而且 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?)。

于 2016-06-30T23:47:28.663 回答
0

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

于 2016-06-30T18:35:30.883 回答