播放框架动态模板包括

时间:2013-12-29 09:27:26

标签: scala playframework-2.1

我有一个模板,必须包含另一个基于来自数据库的文件名的模板。例如,这是一个模板,它接受一个String,其中包含将包含在另一个模板中的模板文件的名称。

@(sourceCodeFileName: Option[String])
@{sourceCodeFileName match {
    case Some(sourceCode) => {
        @sourcecode.sourceCodeFileName + "scala.html"
    }
}}

其中sourcecode是实际模板所在的包。例如,如果上面模板的String参数是myview,那么我想包含myview.scala.html。有没有办法在Play框架中执行此操作?

2 个答案:

答案 0 :(得分:1)

要将HTML从静态文件注入scala模板,您可以在模板中定义一个函数:

@import scala.io.Source

@injectHtmlFromFile(sourceCodeFilename: String) = { @{
    Html(Source.fromFile("static/html/" + sourceCodeFilename + ".html").mkString)
}}

...稍后在模板中调用它:

@injectHtmlFromFile(sourceCode.sourceCodeFileName)
边注

我不确定我是否完全理解这个问题 - 我已经回答了OP commentthe same question posted by him on Google Groups

答案 1 :(得分:0)

Play scala模板是一个返回Html的函数。您应该在控制器中获取模板对象并将其传递给模板。但在简单的情况下,传递渲染的Html更容易:

您的模板将如下所示:

@(content: Option[Html])
@content

和控制器:

object Application extends Controller {
  def index = Action {
    val sourceCodeFileName= ...
    Ok(Some(Class.forName("views.html."+sourceCodeFileName)
        .getConstructor().newInstance().asInstanceOf[() => play.api.templates.Html]()
      ))
  }
}