如何扩展elixir phoenixframework html表单助手

时间:2015-12-13 19:27:14

标签: html forms helper elixir phoenix-framework

我尝试扩展phoenixframework的Phoenix.HTML.Form模块。我的意图是包装html表单帮助器text_input以创建timex日期值的文本输入字段,以便将其与bootstrap-datepicker一起使用。

我是elixir的新手,但我读到了扩展elixir模块的协议。所以我尝试了:

defprotocol Phoenix.HTML.Form.Extension do
  def timex_date_input(form, field, opts \\ [])
end

defimpl Phoenix.HTML.Form.Extension, for: Phoenix.HTML.Form do
  def timex_date_input(%{model: model, params: params}, field, opts \\ []) do
    # my logic goes here
    form = %{model: model, params: params}
    text_input(form, field, opts)
  end
end

但是,它不起作用,因为:"函数text_input / 3 undefined"。什么是正确的解决方案?

1 个答案:

答案 0 :(得分:2)

您需要导入Phoenix.HTML.Form模块才能使用text_input - 您会发现这已导入您的视图(以及您的模板,因为它们是您视图中的功能) web.ex文件。

如果你想添加一个新的表单函数,你可以简单地定义函数(不需要协议 - 这些通常用作扩展库的方法 - phoenix_ecto就是一个很好的例子) :

defmodule MyApp.FormHelpers
  def timex_date_input(form, field, opts \\ [])   do
    # my logic goes here
    form = %{model: model, params: params}
    Phoenix.HTML.Form.text_input(form, field, opts)
  end

然后您可以将其导入视图(import MyApp.FormHelpers),或在模板中使用完整的函数名称:

<%= timex_date_input(f, :date, ...) %>