我不知道 Apache Tiles 是如何工作的,但如果我正确理解的话,它提供了一种create pages using smaller components 的方法(如页眉、菜单、页脚等)和某种包含机制来粘合这些组件一起,然后组成页面。
也就是说,您可以使用Twirl 实现相同的目的。您只需要declare reusable blocks 即可在同一页面中使用,或者您可以使用Rails partials 之类的内容,可在不同页面中重复使用。
让我们看一个例子。假设您有以下文件:
文件app/views/partials/header.scala.html:
<header>
<h1>My Header</h1>
</header>
文件app/views/partials/navigation.scala.html:
<nav>
<ul>
<li><a href="/home">Home</a></li>
<li><a href="/profile">Profile</a></li>
<li><a href="/faq">FAQ</a></li>
</ul>
</nav>
文件app/views/partials/footer.scala.html:
<footer>
Some copyright info
</footer>
文件app/views/main.scala.html:
@(title: String)(content: Html)
<!DOCTYPE html>
<html lang="en">
<head>
<title>@title</title>
<link rel="stylesheet" media="screen" href="@routes.Assets.versioned("stylesheets/main.css")">
<script src="@routes.Assets.versioned("javascripts/hello.js")" type="text/javascript"></script>
</head>
<body>
@partials.header()
@partials.navigation()
@content
@partials.footer()
</body>
</html>
上面的文件不仅定义了一些可重用的部分模板(页眉、导航和页脚),而且还定义了一个通用布局(主),您的应用程序的所有页面都可以重用。现在,让我们看看使用上述结构的页面:
文件app/views/users/profile.scala.html:
@(user: models.User)
@main(title = "User Profile Page") {
<h2>This is the profile page of @user.username</h2>
}
还有更多:由于视图被编译为 Scala 代码,您可以导入用 Scala/Java 编写的代码并直接从您的视图中调用它,例如 Rails view helpers:
文件app/views/helpers/DateHelpers.scala:
package views.helpers
object DateHelpers {
def formatToISO8601(date: Date) = {
??? // format the date
}
}
让我们在app/views/users/profile.scala.html 页面中使用这个助手:
@(user: models.User)
@import controllers.DateHelpers._
@main(title = "User Profile Page") {
<h2>This is the profile page of @user.username.</h2>
<p>User since @formatToISO8601(user.createdAt)</p>
}
还有其他方法可以考虑:
- Ping-Play: Big Pipe Streaming for the Play Framework
- 您可以创建一个与 Apache Tiles 集成的 Play 模块。我很确定这是可能的。