2016-06-30 32 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

相關問題