文件

§表單範本輔助程式

Play 提供了多個輔助程式,以協助您在 HTML 範本中呈現表單欄位。

§建立 <form> 標籤

第一個輔助函式建立 <form> 標籤。這是一個相當簡單的輔助函式,會自動根據你傳入的反向路由設定 actionmethod 標籤參數

@helper.form(action = routes.Application.submit) {

}

你也可以傳入一組額外的參數,這些參數會加入到產生的 HTML 中

@helper.form(action = routes.Application.submit, Symbol("id") -> "myForm") {

}

§呈現 <input> 元素

views.html.helper 套件中有幾個輸入輔助函式。你可以提供表單欄位給它們,它們會顯示對應的 HTML 表單控制項,包含已填入的值、約束和錯誤

@(myForm: play.data.Form[User])(implicit messages: play.i18n.Messages)

@helper.form(action = routes.Application.submit) {

    @helper.inputText(myForm("email"))

    @helper.inputPassword(myForm("password"))

}

form 輔助函式一樣,你可以指定一組額外的參數,這些參數會加入到產生的 HTML 中

@helper.inputText(myForm("email"), Symbol("id") -> "email", Symbol("size") -> 30)

注意:所有額外的參數都會加入到產生的 HTML 中,但名稱以 _ 字元開頭的參數除外。以底線開頭的參數保留給欄位建構函式的參數(我們稍後會看到)。

§自行處理 HTML 輸入建立

還有一個更通用的 input 輔助函式,讓你編寫所需的 HTML 結果

@helper.input(myForm("email")) { (id, name, value, args) =>
    <input type="date" name="@name" id="@id" @toHtmlArgs(args)>
}

§欄位建構函式

已呈現的欄位不只包含一個 <input> 標籤,也可能需要一個 <label> 標籤和一堆其他標籤,讓你的 CSS 架構用來裝飾欄位。

所有輸入輔助函式都採用一個隱含的 FieldConstructor 來處理這部分。預設的建構函式(如果範圍內沒有其他欄位建構函式可用時使用),會產生類似這樣的 HTML

<dl class="error" id="email_field">
    <dt><label for="email">Email:</label></dt>
    <dd><input type="text" name="email" id="email" 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 -> "Custom label"
'_id -> "idForTheTopDlElement"
'_help -> "Custom help"
'_showConstraints -> false
'_error -> "Force an error"
'_showErrors -> false

§撰寫您自己的欄位建構函式

您通常需要撰寫您自己的欄位建構函式。從撰寫範本開始,如下所示

@(elements: helper.FieldElements)

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

將其儲存在 views/ 中,並將名稱命名為 myFieldConstructorTemplate.scala.html

注意:這只是一個範例。您可以依需要讓它變得更複雜。您也可以使用 @elements.field 存取原始欄位。

現在使用下列方式在某處建立 FieldConstructor

@implicitField: FieldConstructor = @{ FieldConstructor(myFieldConstructorTemplate.f) }

@inputText(myForm("email"))

§處理重複值

最後一個輔助函式讓為重複值產生輸入變得更簡單。假設您有這種類型的表單定義

public class UserForm {

  private String name;
  private List<String> emails;

  public void setName(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public void setEmails(List<String> emails) {
    this.emails = emails;
  }

  public List<String> getEmails() {
    return emails;
  }
}

當您使用像這樣的重複資料時,有兩種替代方案可以在 HTTP 要求中傳送表單值。首先,您可以使用空括號對為參數加上字尾,例如「emails[]」。然後,此參數可以用標準方式重複,例如 http://foo.com/request?emails[][email protected]&emails[][email protected]。或者,客戶端可以使用陣列下標明確地將參數命名為唯一名稱,例如 emails[0]emails[1]emails[2],依此類推。此方法也讓您可以維護輸入順序。

現在,您必須為 emails 欄位產生與表單包含的數量一樣多的輸入。只要使用 repeat 輔助函式即可

@helper.inputText(userForm("name"))

@helper.repeat(userForm("emails"), min = 1) { emailField =>

    @helper.inputText(emailField)

}

使用 min 參數顯示最小數量的欄位,即使對應的表單資料為空。

如果您想存取欄位的索引,您可以改用 repeatWithIndex 輔助函式

@helper.repeatWithIndex(userForm("emails"), min = 1) { (emailField, index) =>

    @helper.inputText(emailField, Symbol("_label") -> ("email #" + index))

}

下一步:使用 Json


在此文件當中發現錯誤了嗎?此頁面的原始碼可以在 這裡 找到。在閱讀 文件指南 之後,請隨時提出拉取請求。有問題或建議要分享嗎?請前往 我們的社群論壇 與社群展開對話。