مربع الاختيار · النموذج
Phoenix
<.form
:let={f}
for={@form}
action="/account/terms"
method="post"
>
<.checkbox field={f[:terms]} class="checkbox">
<:label>Accept terms</:label>
<:error :let={msg}>
<.heroicon name="hero-exclamation-circle" class="icon" />
{msg}
</:error>
</.checkbox>
<.action type="submit" class="button button--accent">
Submit
</.action>
</.form>
def account_terms_page(conn, _params) do
changeset = MyApp.Forms.Terms.changeset(%MyApp.Forms.Terms{}, %{})
form =
Phoenix.Component.to_form(changeset,
as: :terms_changeset,
id: "account-terms-changeset-form"
)
render(conn, :account_terms, form: form)
end
def account_terms_create(conn, %{"terms_changeset" => params}) do
case MyApp.Forms.Terms.changeset(%MyApp.Forms.Terms{}, params) do
%Ecto.Changeset{valid?: true} = changeset ->
data = Ecto.Changeset.apply_changes(changeset)
conn
|> put_flash(:info, "Saved: terms=#{data.terms}")
|> redirect(to: "/account")
changeset ->
changeset = Map.put(changeset, :action, :insert)
form =
Phoenix.Component.to_form(changeset,
as: :terms_changeset,
id: "account-terms-changeset-form"
)
render(conn, :account_terms, form: form)
end
end
نموذج Phoenix (changeset)
<.form
:let={f}
for={@form}
action="/account/terms"
method="post"
>
<.checkbox field={f[:terms]} class="checkbox">
<:label>Accept terms (strict messages)</:label>
<:error :let={msg}>
<.heroicon name="hero-exclamation-circle" class="icon" />
{msg}
</:error>
</.checkbox>
<.action type="submit" class="button button--accent">
Submit
</.action>
</.form>
def account_terms_strict_page(conn, _params) do
changeset =
MyApp.Forms.Terms.changeset_validate(%MyApp.Forms.Terms{}, %{})
form =
Phoenix.Component.to_form(changeset,
as: :terms_validate,
id: "account-terms-validate-form"
)
render(conn, :account_terms_strict, form: form)
end
def account_terms_strict_create(conn, %{"terms_validate" => params}) do
case MyApp.Forms.Terms.changeset_validate(%MyApp.Forms.Terms{}, params) do
%Ecto.Changeset{valid?: true} = changeset ->
data = Ecto.Changeset.apply_changes(changeset)
conn
|> put_flash(:info, "Saved: terms=#{data.terms}")
|> redirect(to: "/account")
changeset ->
changeset = Map.put(changeset, :action, :insert)
form =
Phoenix.Component.to_form(changeset,
as: :terms_validate,
id: "account-terms-validate-form"
)
render(conn, :account_terms_strict, form: form)
end
end
defmodule MyApp.Forms.Terms do
use Ecto.Schema
import Ecto.Changeset
embedded_schema do
field :terms, :boolean, default: false
end
def changeset(terms, attrs \\ %{}) do
terms
|> cast(attrs, [:terms])
|> validate_required([:terms])
|> validate_acceptance(:terms)
end
def changeset_validate(terms, attrs \\ %{}) do
terms
|> cast(attrs, [:terms])
|> validate_required([:terms], message: "can't be blank")
|> validate_acceptance(:terms, message: "must be accepted to continue")
end
end
Native HTML Form
<form
action="/register"
method="post"
>
<input type="hidden" name="_csrf_token" value={Plug.CSRFProtection.get_csrf_token()} />
<.checkbox
name="user[accept_terms]"
class="checkbox"
>
<:label>Accept terms</:label>
</.checkbox>
<.action type="submit" class="button button--accent">Submit</.action>
</form>
def register_create(conn, %{"user" => %{"accept_terms" => terms}}) do
checked = Phoenix.HTML.Form.normalize_value("checkbox", terms)
conn
|> put_flash(:info, "Submitted: terms=#{inspect(checked)}")
|> redirect(to: "/register")
end