是否可以传入游戏!模板作为变量?

时间:2016-06-30 17:13:37

标签: java scala reflection playframework play-templates

我正在使用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());

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

对于Scala来说,我是一个相当新的模板,如果问题稍微存在或者需要更多信息,那么就道歉了。

更新

这最终是我希望如何使用此代码:

String template = object.getTemplateName();

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

显然没有引号,但希望你能抓住我的漂移。

2 个答案:

答案 0 :(得分: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?)。

答案 1 :(得分:0)

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