查看源代码 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 结构体,其中包含 idnamevalueerrors 预填充。

字段名称可以是原子或字符串。如果它是原子,它假定表单将数据和错误都作为原子存储。如果是字符串,则认为数据和错误以字符串形式存储在该字段中。由 Ecto.Changeset 支持的表单仅支持原子字段名称。

可以“访问”源数据结构中不存在的字段。一个 Phoenix.HTML.FormField 结构体将被动态创建,其中一些属性(如 nameid)将被填充。

自定义实现

有一个名为 Phoenix.HTML.FormData 的协议,任何想要转换为 Phoenix.HTML.Form 结构体的任何数据结构都可以实现该协议。

摘要

函数

定义 Phoenix.HTML.Form 结构体。

接收两个表单结构体,并检查给定字段是否已更改。

返回对应表单字段的 id。

返回对应表单字段的 id,以及附加到它的值。

返回对应表单字段的名称。

返回将应用于给定字段的 HTML 验证。

返回对应表单字段的值。

根据其输入 type 规范化输入 value

返回要在选择器中使用的选项。

类型

@type field() :: atom() | String.t()
@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{}

查看源代码 (结构体)

定义 Phoenix.HTML.Form 结构体。

它的字段是

  • :source - 实现表单数据协议的数据结构

  • :impl - 包含表单数据协议实现的模块。这用于避免多次协议调度。

  • :id - 生成输入字段时要使用的 id

  • :index - 结构体在表单中的索引

  • :name - 生成输入字段时要使用的名称

  • :data - 用于存储查找数据的字段

  • :params - 与此表单关联的参数

  • :hidden - 需要在后台作为隐藏输入提交表单的字段的关键字列表

  • :options - 在创建表单时给出的选项的副本,不包含任何表单数据特定的键

  • :errors - 与表单关联的错误的关键字列表

链接到此函数

input_changed?(form1, form2, field)

查看源代码
@spec input_changed?(t(), t(), field()) :: boolean()

接收两个表单结构体,并检查给定字段是否已更改。

如果与之关联的值、错误、操作或实现发生了更改,则该字段将已更改。这主要用于优化引擎作为 Access 行为的扩展。

@spec input_id(t() | atom(), field()) :: String.t()

返回对应表单字段的 id。

表单应该是 Phoenix.HTML.Form 或原子。

链接到此函数

input_id(name, field, value)

查看源代码
@spec input_id(t() | atom(), field(), Phoenix.HTML.Safe.t()) :: String.t()

返回对应表单字段的 id,以及附加到它的值。

对于单选按钮和类似多选复选框的输入很有用。

链接到此函数

input_name(form_or_name, field)

查看源代码
@spec input_name(t() | atom(), field()) :: String.t()

返回对应表单字段的名称。

第一个参数应该是 Phoenix.HTML.Form 或原子。

示例

iex> Phoenix.HTML.Form.input_name(:user, :first_name)
"user[first_name]"
链接到此函数

input_validations(form, field)

查看源代码
@spec input_validations(t(), field()) :: Keyword.t()

返回将应用于给定字段的 HTML 验证。

链接到此函数

input_value(form, field)

查看源代码
@spec input_value(t() | atom(), field()) :: term()

返回对应表单字段的值。

The form 应该是 Phoenix.HTML.Form 或原子。字段是字符串或原子。如果字段以原子形式给出,它将尝试使用原子键查找数据。如果是字符串,它将使用字符串键查找数据。

当给定表单时,它将查找更改,然后回退到参数,最后回退到默认结构/映射值。

由于该函数也查找参数值,因此不能保证该值具有特定类型。例如,布尔字段将以“false”作为参数发送,此函数将按原样返回它。如果您需要规范化 input_value 的结果,请参阅 normalize_value/2

链接到此函数

normalize_value(arg1, value)

查看源代码

根据其输入 type 规范化输入 value

某些 HTML 输入值必须进行转换,否则在渲染时会出现特异性。此函数的目的是封装此逻辑。特别是

  • 对于“datetime-local”类型,它将 DateTimeNaiveDateTime 转换为字符串,但不带秒精度

  • 对于“checkbox”类型,它根据输入是“true”还是“false”返回布尔值

  • 对于“textarea”,它在内容前加一个换行符,以确保在提交时不会忽略换行符。但是,这需要文本区域在渲染时内容后没有空格

链接到此函数

options_for_select(options, selected_values)

查看源代码

返回要在选择器中使用的选项。

这在手动构建选择器时很有用。它期望所有选项和一个或多个选择值。

示例

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>