文档

§表单模板助手

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


发现此文档中的错误?此页面的源代码可以在 这里 找到。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?访问 我们的社区论坛,与社区开始对话。