Sharable

システム&ウェブのシェアラブル

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

2012年4月10日

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

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

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

//views/tags/notice.scala.html
@(level: String = "error")(body: (String) => Html)

@level match {
 case "success" => {
  <p class="success">
   @body("green")
  </p>
 }

 case "warning" => {
  <p class="warning">
   @body("orange")
  </p>
 }

 case "error" => {
  <p class="error">
   @body("red")
  </p>
 }    
}

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

public void notice(String level, Html body)

こんな感じでしょうか。

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

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

@import tags._
 
@notice("error") { arg =>
 お, <span style="color:@arg">色変わる</span>ぞ。
}
※bodyはplay.api.templates.Html型です。「テンプレート引数に、更に引数を渡せるの?」という複雑な現象ではなくて、単にHtmlクラスが引数を1つ取れるように実装されているだけなのです。なので、@body(“green”,”13px”)みたいにするとコンパイルエラーになります。

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

 case "error" => {
    <p class="error">
      @body("red")
    </p>
  }

が呼び出されます。

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

<p class="error">
 お,<span style="color:red">色変わる</span>ぞ。
</p>

こんな感じのHtmlです。

アセスメント

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

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

このエントリーをはてなブックマークに追加