【发布时间】:2012-04-13 03:30:09
【问题描述】:
Play 1.0中有TemplateLoader,用于在运行时生成模板。
有没有办法在Play 2.0动态加载模板?或者我可以以某种方式将其转换为使用Eval 的scala 代码吗?
例如:我想在数据库中存储一些模板,以便某些用户可以编辑它们。
【问题讨论】:
标签: java scala dynamic playframework-2.0
Play 1.0中有TemplateLoader,用于在运行时生成模板。
有没有办法在Play 2.0动态加载模板?或者我可以以某种方式将其转换为使用Eval 的scala 代码吗?
例如:我想在数据库中存储一些模板,以便某些用户可以编辑它们。
【问题讨论】:
标签: java scala dynamic playframework-2.0
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 包中找到更多信息。
【讨论】:
framework/src/play/src/main/scala/system/ApplicationProvider.scala 中,我会看ReloadableApplication 类。但这似乎在后台将任务传递给 sbt。当然,您应该考虑是否希望您的用户能够编写模板。鉴于他们拥有完全的编程能力,你是不是对大规模的黑客攻击敞开心扉?万事如意
相关代码似乎在 Play-2.0 目录下的framework/src/play/src/main/scala/system/ApplicationProvider.scala 中,尤其是ReloadableApplication 类。我不确定这种即时编译是否适合您,因为您不想在请求模板时这样做(它很慢)。这意味着存储在数据库中没有多大意义:您不想存储模板源代码,而是存储已编译的模板对象。
为了争论,如果您只是将模板写入app/views 目录,您可以让 Play 自行编译它们。但是,请注意,因为它们可能无法在生产系统上编译。
【讨论】: