【问题标题】:Dynamic templates in Play Framework 2.0Play Framework 2.0 中的动态模板
【发布时间】:2012-04-13 03:30:09
【问题描述】:

Play 1.0中有TemplateLoader,用于在运行时生成模板。

有没有办法在Play 2.0动态加载模板?或者我可以以某种方式将其转换为使用Eval 的scala 代码吗?

例如:我想在数据库中存储一些模板,以便某些用户可以编辑它们。

【问题讨论】:

    标签: java scala dynamic playframework-2.0


    【解决方案1】:

    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 包中找到更多信息。

    【讨论】:

    • 谢谢,但问题是关于如何在运行时生成新模板。例如,我想在数据库中存储一些模板,以便某些用户可以编辑它们。
    • 啊,一个更复杂的命题。看来相关代码在 Play-2.0 目录下的framework/src/play/src/main/scala/system/ApplicationProvider.scala 中,我会看ReloadableApplication 类。但这似乎在后台将任务传递给 sbt。当然,您应该考虑是否希望您的用户能够编写模板。鉴于他们拥有完全的编程能力,你是不是对大规模的黑客攻击敞开心扉?万事如意
    • 谢谢!我想这就是我要找的。再次感谢您的谨慎,但当然,此功能仅适用于已经有机会销毁它的用户的开发服务器。请更新您的答案,以便我接受。
    【解决方案2】:

    相关代码似乎在 Play-2.0 目录下的framework/src/play/src/main/scala/system/ApplicationProvider.scala 中,尤其是ReloadableApplication 类。我不确定这种即时编译是否适合您,因为您不想在请求模板时这样做(它很慢)。这意味着存储在数据库中没有多大意义:您不想存储模板源代码,而是存储已编译的模板对象。

    为了争论,如果您只是将模板写入app/views 目录,您可以让 Play 自行编译它们。但是,请注意,因为它们可能无法在生产系统上编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多