Skip to content

[Form] Make difference between data and empty_data options more visisble #7802

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
May 4, 2017
Merged
9 changes: 8 additions & 1 deletion form/use_empty_data.rst
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,14 @@ a ``data_class`` option for your form class, it will default to a new instance
of that class. That instance will be created by calling the constructor
with no arguments.

If you want to override this default behavior, there are two ways to do this.
If you want to override this default behavior, there are two ways to do this:

* `Option 1: Instantiate a new Class`_
* `Option 2: Provide a Closure`_

If you didn't set the ``data_class`` option, you can pass the initial data as
string or pass an array of strings (where the key matches the field name) when
the form type is compound.

Option 1: Instantiate a new Class
---------------------------------
Expand Down
18 changes: 10 additions & 8 deletions reference/forms/types/options/data.rst.inc
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
data
~~~~

**type**: ``mixed`` **default**: Defaults to field of the underlying object (if there is one)
**type**: ``mixed`` **default**: Defaults to field of the underlying structure.

When you create a form, each field initially displays the value of the
corresponding property of the form's domain object (if an object is bound
to the form). If you want to override the initial value for the form or
just an individual field, you can set it in the data option::
corresponding property of the form's domain data (e.g. if you bind an object to
the form). If you want to override this initial value for the form or
an individual field, you can set it in the data option::


$builder->add('token', 'hidden', array(
'data' => 'abcdef',
));

.. note::
.. caution::

The default values for form fields are taken directly from the underlying
data structure (e.g. an entity or an array). The ``data`` option overrides
this default value.
The ``data`` option *always* overrides the value taken from the domain data
(object) when rendering. This means the object value is also overriden when
the form edits an already persisted object, causing it to loose it's
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[...] to lose its persisted [...]

persisted value when the form is submitted.
41 changes: 26 additions & 15 deletions reference/forms/types/options/empty_data.rst.inc
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,35 @@ empty_data

DEFAULT_PLACEHOLDER

This option determines what value the field will return when the submitted
value is empty.

But you can customize this to your needs. For example, if you want the
``gender`` choice field to be explicitly set to ``null`` when no value is
selected, you can do it like this::

$builder->add('gender', 'choice', array(
'choices' => array(
'm' => 'Male',
'f' => 'Female'
),
'required' => false,
'placeholder' => 'Choose your gender',
'empty_data' => null
This option determines what value the field will *return* when the submitted
value is empty (or missing). It does not set an initial value if none is
provided when the form is rendered in a view.

This means it helps you handling form submission with blank fields. For
example, if you want the ``name`` field to be explicitly set to ``John Doe``
when no value is selected, you can do it like this::

$builder->add('name', null, array(
'required' => false,
'empty_data' => 'John Doe',
));

This will still render an empty text box, but upon submission the ``John Doe``
value will be set. Use the ``data`` or ``placeholder`` options to show this
initial value in the rendered form.

If a form is compound, you can set ``empty_data`` as an array, object or
closure. See the :doc:`/form/use_empty_data` article for more details about
these options.

.. note::

If you want to set the ``empty_data`` option for your entire form class,
see the :doc:`/form/use_empty_data` article.

.. caution::

:doc:`Form data transformers </form/data_transformers>` will still be
applied to the ``empty_data`` value. This means that an empty string will
be casted to ``null``. Use a custom data transformer if you explicitly want
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cast

to return the empty string.