playframework1‎ > ‎template‎ > ‎

fieldタグ

入力フォームを作成する作業をパターン化して、記述量を軽減しようとする試み。
#{field 'user.name' } .... #{/field} のようにフォーム部分を挟んで使う。
挟まれたコード内では、fieldという変数が有効となり、下記のプロパティを参照することができる。

プロパティ 説明
 id 引数のドットをアンスコに変換した文字列。'user.name' → 'user_name'
 name 引数そのまま。'user.name' → 'user.name'
 flash flash.get(引数) で取得した値。
 flashArray flash.get(引数) で取得した値をカンマ区切りのデータとして、配列にしたもの。
 error Validation.error(引数) で取得された値。
 errorClass Validarion.error(引数) で値が取得された時、 "hasError" という文字列を設定する。
 例)cssでhasErrorクラスを作っておき、<span class="${field.errorClass}">${field.error}</span> 
 value 引数の値を設定する。階層は2階層目まで対応。
 
'user.zipcode' はOKだが、'user.address.city'とかはNG。
 常にfield変数を使ったコードのみを記述できるので、入力フォームコードの共有が容易になる。

常にfield変数を使ったコードのみを記述できるので、入力フォームコードの共有が容易になる。

#{field 'user.name'}
 <p>
   <label>&{field.name}</label>
   <input type="text" id="${field.id}" name="${field.name}" value="${field.value}" class="${field.errorClass}">
   <span class="error">${field.error}</span>
 </p>
#{/field}

注意

${field.value} については、#{field}タグを置いたスコープで取得する変数が参照できることが大前提にある。
以下に例を示す。

app/controllers/Application.java
public class Application extends Controller {
    public static void index() {
        render(user);
    }
}

app/views/Application/index.html
#{field 'user.name'}
この場所なら ${field.value} は有効。
#{/field}

#{orginalTag 'user.name' /}

app/views/tags/originalTag.html
#{field _arg}
この場所だと ${field.value} は無効となる。ここでは変数'user'が有効でないから、${user.name}の値を取得できない。
#{/field}


対策としては、呼出元でsetタグを用いてグローバル変数化する。こうするとタグがネストされていても、変数を参照できる。
app/views/Application/index.html
#{set user:user /}

#{originalTag 'user.name' /}