Lv.14 テンプレートエンジンで独自ファンクションを使いたい![play framework2.0] [java]

ちょっとCommon Caseとは分けて記事にしました。
独自ファンクションの実装方法。
とても便利だ、、、。

ほとんど公式サイトのままですけど、ちょこっとだけ変えてます。

独自ファンクションの実装方法

[java toolbar=”false”]
//views/tags/notice.scala.html
@(level: String = “error”)(body: (String) => Html)

@level match {
case “success” => {

@body(“green”)

}

case “warning” => {

@body(“orange”)

}

case “error” => {

@body(“red”)

}
}[/java]

これはとても分かり易いですね。
単なるswitch文みたいなファンクションを定義してます。
テンプレート引数が2つあるので、あえてこのファンクションテンプレート(と仮に呼びます)
をJavaっぽく書くと、

[java toolbar=”false”]public void notice(String level, Html body)[/java]

こんな感じでしょうか。

内容は、「テンプレート引数のlevelが次のcaseにmatchした場合はこうして」ということ。

これを呼び出すテンプレートも見てみましょう。

[java toolbar=”false”]
@import tags._

@notice(“error”) { arg =>
お, 色変わるぞ。
}
[/java]

※bodyはplay.api.templates.Html型です。「テンプレート引数に、更に引数を渡せるの?」という複雑な現象ではなくて、単にHtmlクラスが引数を1つ取れるように実装されているだけなのです。なので、@body(“green”,”13px”)みたいにするとコンパイルエラーになります。

caseの中で呼ばれている@body※の引数(greenとかred)が上のコードの「arg」にあたります。
ここでは第一引数がerrorになっているので、notice側の

[java toolbar=”false”] case “error” => {

@body(“red”)

}[/java]

が呼び出されます。

よって、表示されるのは、

[java toolbar=”false”]

お,色変わるぞ。

[/java]

こんな感じのHtmlです。

アセスメント

  • 独自ファンクションを定義する方法が分かる
  • 独自ファンクションを使用する方法が分かる

公式ドキュメントは前回と同じく、Common template use casesでした。