2012-04-11 72 views
3

Play 1.0中有TemplateLoader用於在運行時生成模板。Play Framework 2.0中的動態模板

是否有任何解決方案動態加載模板Play 2.0?或者我可以以某種方式將其轉換爲使用Eval的斯卡拉代碼?

例如:我想在數據庫中存儲一些模板,以便某些用戶可以編輯它們。

回答

2

看來相關的代碼是在Play-2.0目錄中的framework/src/play/src/main/scala/system/ApplicationProvider.scala,特別是ReloadableApplication類。我不確定這個動態編譯如何適合你,因爲你不想在模板被請求時這麼做(它很慢)。這意味着存儲在數據庫中並不合理:您不希望存儲模板源代碼,而是存儲已編譯的模板對象。

出於參數的原因,如果您只是將模板寫入app/views目錄,您可以讓Play在閒暇時編譯它們。但是,要小心,因爲它們可能不會在生產系統上編譯。

3

Play 2.0已經將您的模板編譯爲對象方法,因此您不必「動態加載」它們!

請考慮這個簡單的模板app/views/test.scala.html

@(num:Long) 
Your number is @num 

變成的views.html Scala的方法稱爲test。使用此代碼評估它:

val msg : String = views.html.test(23).toString() 

您不必僅使用html視圖。要在字符串中使用模板,請使用play.api.templates.Txt派生類。這是一個名爲app/views/quick.scala.txt模板:

@(id:Long)Your id is @id 

它成爲一個方法views.txt.quick和使用:

val msg2 : String = views.txt.quick(32).body 

你可以找到更多的the documentation for the the play.api.templates包。

+0

謝謝,但問題是關於如何在運行時生成新模板。例如,我想在數據庫中存儲一些模板,以便某些用戶可以編輯它們。 – senia 2012-04-12 06:04:47

+1

啊,這是一個更復雜的命題。看起來相關的代碼在Play-2.0目錄下的'framework/src/play/src/main/scala/system/ApplicationProvider.scala'中,我會看看'ReloadableApplication'類。但是這似乎將任務交給了後臺。當然,你應該考慮你是否願意你的用戶能夠編寫模板。鑑於他們擁有完全的編程能力,你是不是打開自己的大規模黑客?一切順利 – craigmj 2012-04-12 07:06:47

+0

謝謝!我認爲這是我正在尋找的。再次感謝您的警惕,但是當然,這些功能只能在開發服務器上爲已經有機會銷燬它的用戶提供。請更新您的答案,以便我可以接受它。 – senia 2012-04-12 07:34:05