テンプレート

Play! ではテンプレートエンジンとして Groovy を採用しています。

基本構文

値の評価は ${...} 構文を使用します。メソッドを実行することも可能です。 また、. でフィールドアクセスする場合に ? を付けることで、オブジェクトが Null の場合でもエラーが発生しないよう制御することが可能です。

${user.name}
${user.someMethod()}
${user?.someMethod()}

条件分岐は if, elseif, else 構文を使用します。

#{if user.isSales}
    sales.
#{/if}
#{elseif user.isDeveloper}
    developer.
#{/elseif}
#{else}
    other.
#{/else}

ループ処理は list 構文を使用します。

#{list items: users, as: 'user'}
    ${user.name}
#{/list}

別のテンプレートを読み込む場合は include 構文を使用します。 読み込み元と読み込み先のテンプレートでスコープは同一となります。

#{include 'another.html' /}

テンプレート上にコントローラの URL を展開したい場合は @{} 構文を使用します。 メソッドの引数は省略可能です。

<a href="@{Users.show(user.id)}">${user.name}</a>

エラーメッセージの表示

Play! では、コントローラ側でエラーが発生した場合に、テンプレート上でエラーメッセージを表示させるための標準的なアプローチが用意されています。

まず、コントローラ側でエラー情報をセットします。 validation オブジェクトを使用して、入力チェック処理を行うか、独自にエラーメッセージを追加します。

// 必須チェック
validation.required(user.name);

// 独自にエラーメッセージを追加、第1引数は同一エラーメッセージを追加しないよう制御するためのキー文字列
validation.addError("errorMessage", "error!");

テンプレート側では ifErrors タグ、errors タグを使用します。

#{ifErrors}
   <h1>Oops…</h1>
   #{errors}
       <li>${error}</li>
   #{/errors}
#{/ifErrors}

テンプレートの継承

ヘッダやサイドバーなどのサイト全体の共通部分と、ページ毎に変化するコンテンツエリアを分割したいような場合、テンプレートの継承機能を利用します。

<html>
<body>
    <head>...</head>

    <section id="container">
        #{doLayout /}
    </section>

    <footer></footer>
</body>
</html>
#{extends 'parent.html' /}

<h1>child contents.</h1>

カスタムテンプレートタグ

独自のタグを定義したい場合、app/views/tags 配下にテンプレートファイルを配置します。

Hello, World!

カスタムテンプレートタグを呼び出すには以下のように記述します。

#{hello /}

パラメータを受け取ることも可能です。 渡すパラメータが1つの場合は以下のように記述します。

Hello, ${_arg}!

呼び出し側でパラメータを付与します。

#{hello "yamada" /}

パラメータが複数の場合、明示的にパラメータ名を記述する必要があります。 パラメータ名の先頭には必ず _ (アンダースコア) が付きます。

Hello, ${_name} a.k.a ${_nickname}!

呼び出し側でもパラメータ名を指定します。

#{hello name: "yamada", nickname: "da-yama" /}

カスタム Java タグ

カスタムテンプレートタグを Java で実装することも可能です。 play.templates.FastTags を継承したクラスを用意しておくだけで、Play! が自動的に認識してタグを使用することができます。

public class PlayFastTags extends FastTags {
    // #{empty list}#{/empty} タグを定義
    public static void _empty(Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine) {
        Collection<?> collection = (Collection<?>) args.get("arg");
        if (collection != null && collection.isEmpty()) {
            out.println(JavaExtensions.toString(body));
        }
    }
}

Java オブジェクトの拡張

テンプレート内で扱う Java オブジェクトに、動的にメソッドを拡張することが出来ます。 play.templates.JavaExtensions を継承したクラスを用意しておくだけで、Play! が自動的にメソッド拡張を行ってくれます。

例えば、java.util.Date をフォーマットするメソッドを追加する場合、以下のように定義します。

public class PlayJavaExtensions extends JavaExtensions {

    public static String formatDate(Date date) {
        return FormatUtil.formatDate(date);
    }

}

テンプレート側で、予め定義されたメソッドのように呼び出すことが出来ます。

${user.createdAt.formatDate()}

暗黙オブジェクト

テンプレート内で既に定義されているオブジェクトがあります。 これらは予約語となるため、変数名に使用しないよう注意しましょう。

変数名 説明
errors play.data.validation.Validation.errors() から返却されたエラーメッセージのリスト
flash play.mvc.Scope.Flash オブジェクト
lang 現在の言語
messages メッセージのマップ
out 出力ストリーム
params 現在のパラメータ
play play.Play オブジェクト
request play.mvc.Request オブジェクト
session play.mvc.Scope.Sessionオブジェクト

results matching ""

    No results matching ""