我有一个模板,必须包含另一个基于来自数据库的文件名的模板。例如,这是一个模板,它接受一个String,其中包含将包含在另一个模板中的模板文件的名称。
@(sourceCodeFileName: Option[String])
@{sourceCodeFileName match {
case Some(sourceCode) => {
@sourcecode.sourceCodeFileName + "scala.html"
}
}}
其中sourcecode是实际模板所在的包。例如,如果上面模板的String参数是myview,那么我想包含myview.scala.html。有没有办法在Play框架中执行此操作?
答案 0 :(得分:1)
要将HTML从静态文件注入scala模板,您可以在模板中定义一个函数:
@import scala.io.Source
@injectHtmlFromFile(sourceCodeFilename: String) = { @{
Html(Source.fromFile("static/html/" + sourceCodeFilename + ".html").mkString)
}}
...稍后在模板中调用它:
@injectHtmlFromFile(sourceCode.sourceCodeFileName)
边注
我不确定我是否完全理解这个问题 - 我已经回答了OP comment和the 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]()
))
}
}