Skip to content

[Form] form add extra data #20853

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

Open
wants to merge 11 commits into
base: 6.4
Choose a base branch
from
57 changes: 57 additions & 0 deletions forms.rst
Original file line number Diff line number Diff line change
Expand Up @@ -947,6 +947,63 @@ These "unmapped fields" can be set and accessed in a controller with::
Additionally, if there are any fields on the form that aren't included in
the submitted data, those fields will be explicitly set to ``null``.

Extra fields
~~~~~~~~~~~~

All form fields are considered properties of the object but you can inject
fields directly into your view without specifying them in the form definition.
They can be retrieved via the ``getExtraData`` :class:`Symfony\\Component\\Form\\FormTypeInterface`.
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
They can be retrieved via the ``getExtraData`` :class:`Symfony\\Component\\Form\\FormTypeInterface`.
They can be retrieved via the :method:`FormInterface::getExtraData() <Symfony\\Component\\Form\\FormInterface::getExtraData>`
method.


This is a creation user form::

// ...
use App\User;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;

class UserCreateType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('username', TextType::class)
->add('email', EmailType::class)
;
}

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => User::class,
]);
}
}

The extra fields can be injected like this:

.. code-block:: html+twig

{# templates/user/create.html.twig #}
{{ form_start(form) }}
{{ form_row(form.username) }}
{{ form_row(form.email) }}

{# Hidden field to send additional referral code #}
<input type="hidden" name="{{ form.vars.full_name ~ '[referralCode]' }}" value="{{ referralCode }}"/>

<button type="submit">Submit</button>
{{ form_end(form) }}

Here, the referral code is an extra field injected at view level.

You can get the referral code via ``getExtraData``::

$extraData = $form->getExtraData();
$referralCode = $extraData['referralCode'] ?? null;

> Don't forget to set :ref:`allow_extra_fields <allow-extra-fields>` option to ``true`` on your form

Learn more
----------

Expand Down