テンプレート内の Play Framework では、次のような関数を定義できます。
@title(text: String) = @{
text.split(' ').map(_.capitalize).mkString(" ")
}
<h1>@title("hello world")</h1>
そのような関数を別のファイルで定義して、複数のテンプレート間で再利用できるようにすることはできますか?
テンプレート内の Play Framework では、次のような関数を定義できます。
@title(text: String) = @{
text.split(' ').map(_.capitalize).mkString(" ")
}
<h1>@title("hello world")</h1>
そのような関数を別のファイルで定義して、複数のテンプレート間で再利用できるようにすることはできますか?
少なくともいくつかの解決策があります。
まず、Makisが示したようにタグを使用します。ほとんどの場合、空の行を追加しても問題ありません (少なくとも、HTML スニペットの生成について話している場合、つまり、リストで繰り返しニュース項目を表す場合) - できます。転送速度が気になる場合は、後処理で HTML を最適化/圧縮してください。
2 つ目は、静的関数 (Java でも可能) を含み、 を返す Scala オブジェクトを作成することplay.twirl.api.Html("<div>your code</div>")
です。このようにして、プログラムでコードを必要に応じて正確に適合させたり、空行を避けたり、スペースを削除または置換したりできます。次のような構文を使用する必要があります:ビュー内で返されたコードをエスケープする必要がない原因を返します@full.qualified.path.to.Object.method("foo", "bar")
。Html("...")
3 番目のアプローチは、独自のTemplateMagic のようなメソッドを使用して、任意の型のオブジェクトを拡張し、その上でロジックを実行できるようにすることです。良いサンプルは"active".when(someCondition)
構文です。 repo で行われていることがわかります。もちろん、このようなカスタム クラスを作成し、ビューの最初にインポートする必要があります。また、引数は 1 つだけである必要はないことに注意してBoolean
ください。メソッドでは、必要な数のパラメーター (必要な任意の型) を使用できます。パラメータなしにすることもできます。
編集 - サンプル:
アプリ/myapi/MyMagic.scala
package myapi
import play.twirl.api.Html
import scala.language.implicitConversions
object MyMagic {
class RichString(string: String) {
def upperWords() = {
Html(string.split(' ').map(_.capitalize).mkString(" "))
}
def bold() = {
Html("<b>" + string + "</b>")
}
def when(predicate: => Boolean) = {
predicate match {
case true => string
case false => ""
}
}
}
implicit def richString(string: String): RichString = new RichString(string)
}
ビューでの使用
@(title: String)
@import myapi.MyMagic._
@main("Welcome to Play") {
@title.upperWords() <br>
@{"foo bar baz".upperWords()} <br>
@{"I'm bolded LOL".bold()} <br>
<ul>
@for(item <- 1 to 10){
<li >Item no.: @{item} @{"(first item)".when(item==1)}</li>
}
</ul>
}
title.scala.html
次の内容で名前が付けられた新しいファイルを作成できます。
@(text: String)
@title(text: String) = @{
text.split(' ').map(_.capitalize).mkString(" ")
}
@title(text)
その後、必要に応じてテンプレートで使用できます。