Documentation

You are viewing the documentation for the 2.3.x release series. The latest stable release series is 2.4.x.

§カスタムフィールドコンストラクタ

フィールドのレンダリングは <input> タグだけから構成されるものではなく、<label> や、おそらくフィールドを修飾する CSS フレームワーク が使用するその他のタグも必要になります。

すべての入力ヘルパーは、この役割を担う暗黙の FieldConstructor を使用します。デフォルトのフィールドコンストラクタ (スコープ内で利用可能な他のフィールドコンストラクタがない場合に使用) は、次のような HTML を生成します。

<dl class="error" id="username_field">
    <dt><label for="username">Username:</label></dt>
    <dd><input type="text" name="username" id="username" value=""></dd>
    <dd class="error">This field is required!</dd>
    <dd class="error">Another error</dd>
    <dd class="info">Required</dd>
    <dd class="info">Another constraint</dd>
</dl>

このデフォルトのフィールドコンストラクタは、入力ヘルパーの引数に渡すことができる追加オプションをサポートしています。

'_label -> "カスタムのラベル"
'_id -> "最上位のdl要素のid"
'_help -> "カスタムのヘルプ"
'_showConstraints -> false
'_error -> "強制エラー"
'_showErrors -> false

§独自のフィールドコンストラクタの記述

多くの場合、独自のフィールドコンストラクタを記述する必要があります。 まず次のようなテンプレートを作成します。

@(elements: helper.FieldElements)

<div class="@if(elements.hasErrors) {error}">
    <label for="@elements.id">@elements.label(elements.lang)</label>
    <div class="input">
        @elements.input
        <span class="errors">@elements.errors(elements.lang).mkString(", ")</span>
        <span class="help">@elements.infos(elements.lang).mkString(", ")</span>
    </div>
</div>

メモ: これはほんの一例です。必要に応じて複雑にすることができます。@elements.field を使って元のフィールドにアクセスすることもできます。

このテンプレート関数を使用して FieldConstructor を作成します。

object MyHelpers {
  import views.html.helper.FieldConstructor
  implicit val myFields = FieldConstructor(html.myFieldConstructorTemplate.f)
}

そして、これをフォームヘルパーで使えるようにするために、テンプレート内にインポートします。

@import MyHelpers._
@helper.inputText(myForm("username"))

すると、フォームヘルパーはこのフィールドコンストラクタを使って入力テキストをレンダリングします。

FieldConstructor 用に暗黙の値をインラインで設定することもできます。

@implicitField = @{ helper.FieldConstructor(myFieldConstructorTemplate.f) }
@helper.inputText(myForm("username"))

Next: Working with JSON


このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。