查看源代码 Phoenix.HTML.Form (Phoenix.HTML v4.1.1)
定义一个 Phoenix.HTML.Form
结构体和函数来与它交互。
要在您的 Phoenix 应用程序中构建实际的表单,请参阅 the Phoenix.Component.form/1
组件。
访问行为
The Phoenix.HTML.Form
结构体实现了 Access
行为。当您执行 form[field]
时,它会返回一个 Phoenix.HTML.FormField
结构体,其中包含 id
、name
、value
和 errors
预填充。
字段名称可以是原子或字符串。如果它是原子,它假定表单将数据和错误都作为原子存储。如果是字符串,则认为数据和错误以字符串形式存储在该字段中。由 Ecto.Changeset
支持的表单仅支持原子字段名称。
可以“访问”源数据结构中不存在的字段。一个 Phoenix.HTML.FormField
结构体将被动态创建,其中一些属性(如 name
和 id
)将被填充。
自定义实现
有一个名为 Phoenix.HTML.FormData
的协议,任何想要转换为 Phoenix.HTML.Form
结构体的任何数据结构都可以实现该协议。
摘要
函数
定义 Phoenix.HTML.Form 结构体。
接收两个表单结构体,并检查给定字段是否已更改。
返回对应表单字段的 id。
返回对应表单字段的 id,以及附加到它的值。
返回对应表单字段的名称。
返回将应用于给定字段的 HTML 验证。
返回对应表单字段的值。
根据其输入 type
规范化输入 value
。
返回要在选择器中使用的选项。
类型
@type t() :: %Phoenix.HTML.Form{ action: atom(), data: %{required(field()) => term()}, errors: [{field(), term()}], hidden: Keyword.t(), id: String.t(), impl: module(), index: nil | non_neg_integer(), name: String.t(), options: Keyword.t(), params: %{required(binary()) => term()}, source: Phoenix.HTML.FormData.t() }
函数
定义 Phoenix.HTML.Form 结构体。
它的字段是
:source
- 实现表单数据协议的数据结构:impl
- 包含表单数据协议实现的模块。这用于避免多次协议调度。:id
- 生成输入字段时要使用的 id:index
- 结构体在表单中的索引:name
- 生成输入字段时要使用的名称:data
- 用于存储查找数据的字段:params
- 与此表单关联的参数:hidden
- 需要在后台作为隐藏输入提交表单的字段的关键字列表:options
- 在创建表单时给出的选项的副本,不包含任何表单数据特定的键:errors
- 与表单关联的错误的关键字列表
接收两个表单结构体,并检查给定字段是否已更改。
如果与之关联的值、错误、操作或实现发生了更改,则该字段将已更改。这主要用于优化引擎作为 Access
行为的扩展。
返回对应表单字段的 id。
表单应该是 Phoenix.HTML.Form
或原子。
@spec input_id(t() | atom(), field(), Phoenix.HTML.Safe.t()) :: String.t()
返回对应表单字段的 id,以及附加到它的值。
对于单选按钮和类似多选复选框的输入很有用。
返回对应表单字段的名称。
第一个参数应该是 Phoenix.HTML.Form
或原子。
示例
iex> Phoenix.HTML.Form.input_name(:user, :first_name)
"user[first_name]"
返回将应用于给定字段的 HTML 验证。
返回对应表单字段的值。
The form
应该是 Phoenix.HTML.Form
或原子。字段是字符串或原子。如果字段以原子形式给出,它将尝试使用原子键查找数据。如果是字符串,它将使用字符串键查找数据。
当给定表单时,它将查找更改,然后回退到参数,最后回退到默认结构/映射值。
由于该函数也查找参数值,因此不能保证该值具有特定类型。例如,布尔字段将以“false”作为参数发送,此函数将按原样返回它。如果您需要规范化 input_value
的结果,请参阅 normalize_value/2
。
根据其输入 type
规范化输入 value
。
某些 HTML 输入值必须进行转换,否则在渲染时会出现特异性。此函数的目的是封装此逻辑。特别是
对于“datetime-local”类型,它将
DateTime
和NaiveDateTime
转换为字符串,但不带秒精度对于“checkbox”类型,它根据输入是“true”还是“false”返回布尔值
对于“textarea”,它在内容前加一个换行符,以确保在提交时不会忽略换行符。但是,这需要文本区域在渲染时内容后没有空格
返回要在选择器中使用的选项。
这在手动构建选择器时很有用。它期望所有选项和一个或多个选择值。
示例
options_for_select(["Admin": "admin", "User": "user"], "admin")
#=> <option value="admin" selected>Admin</option>
#=> <option value="user">User</option>
多个选定值
options_for_select(["Admin": "admin", "User": "user", "Moderator": "moderator"],
["admin", "moderator"])
#=> <option value="admin" selected>Admin</option>
#=> <option value="user">User</option>
#=> <option value="moderator" selected>Moderator</option>
也支持分组
options_for_select(["Europe": ["UK", "Sweden", "France"], ...], nil)
#=> <optgroup label="Europe">
#=> <option>UK</option>
#=> <option>Sweden</option>
#=> <option>France</option>
#=> </optgroup>