Play 1.0
中有TemplateLoader
用于在运行时生成模板。Play Framework 2.0中的动态模板
是否有任何解决方案动态加载模板Play 2.0
?或者我可以以某种方式将其转换为使用Eval
的斯卡拉代码?
例如:我想在数据库中存储一些模板,以便某些用户可以编辑它们。
Play 1.0
中有TemplateLoader
用于在运行时生成模板。Play Framework 2.0中的动态模板
是否有任何解决方案动态加载模板Play 2.0
?或者我可以以某种方式将其转换为使用Eval
的斯卡拉代码?
例如:我想在数据库中存储一些模板,以便某些用户可以编辑它们。
看来相关的代码是在Play-2.0目录中的framework/src/play/src/main/scala/system/ApplicationProvider.scala
,特别是ReloadableApplication
类。我不确定这个动态编译如何适合你,因为你不想在模板被请求时这么做(它很慢)。这意味着存储在数据库中并不合理:您不希望存储模板源代码,而是存储已编译的模板对象。
出于参数的原因,如果您只是将模板写入app/views
目录,您可以让Play在闲暇时编译它们。但是,要小心,因为它们可能不会在生产系统上编译。
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
谢谢,但问题是关于如何在运行时生成新模板。例如,我想在数据库中存储一些模板,以便某些用户可以编辑它们。 – senia 2012-04-12 06:04:47
啊,这是一个更复杂的命题。看起来相关的代码在Play-2.0目录下的'framework/src/play/src/main/scala/system/ApplicationProvider.scala'中,我会看看'ReloadableApplication'类。但是这似乎将任务交给了后台。当然,你应该考虑你是否愿意你的用户能够编写模板。鉴于他们拥有完全的编程能力,你是不是打开自己的大规模黑客?一切顺利 – craigmj 2012-04-12 07:06:47
谢谢!我认为这是我正在寻找的。再次感谢您的警惕,但是当然,这些功能只能在开发服务器上为已经有机会销毁它的用户提供。请更新您的答案,以便我可以接受它。 – senia 2012-04-12 07:34:05