2016-06-30 36 views
0

我正在使用Play,并且我有一个简单的EmailService类,用于呈现Play模板中的一些对象。这里是我的代码:是否可以传入Play!模板作为变量?

Content html = views.html.acceptedEmail.render(incomingBlob,relatedBlob,rule); 
     email = new Email().setFrom("[email protected]") 
      .setTo(rule.getSuccessEmailValues()) 
      .setSubject(rule.getFailureNotificationSubject()) 
      .setBodyHtml(html.toString()); 

我不知道是否有可能在acceptedEmail模板传递一个变量的值,这样我在应用模板可以动态改变基于我是什么样的价值传入此代码所来自的EmailService(Java)类。

我是相当陌生的斯卡拉模板,所以道歉,如果问题是在那里或如果更多的信息是必需的。

更新

这是最终我想怎么有这样的代码工作:

String template = object.getTemplateName(); 

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

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

回答

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) 
} 

在任何情况下,这不符合剧中的模板来实现,所以你可能一件小事因为这个我有更好的运气使用另一个模板库只是电子邮件(也许Handlebars Java?)。

+0

谢谢。这似乎证实了自发布问题以来我能够学到的东西。 – daniel9x

0

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

+0

感谢您的回答。你能否提供一个可能看起来像这样的例子?我特别不清楚如何在运行时将对象传递给渲染引擎。 – daniel9x

+0

在你的例子中,'views.html.acceptedEmal'看起来像是一个Play模板对象,所以你已经在使用这个功能。 –

+0

更新了我的问题,希望澄清我面临的挑战。 – daniel9x

相关问题