megadruck
megadruck

Reputation: 427

EventListener on Embedded of different Forms

I have created a form with a collection of other forms in symfony 3. After Submitting I want to manipulate different Datas. How can I get access of it and how can I set them ?

This is how I tried it:

    public function registerAction(Request $request)
{
    $register = $this->createFormBuilder()
        ->add('user', 'AppBundle\Form\Type\UserType', array(
            'data_class' => User::class,
        ))
        ->add('userdata', 'AppBundle\Form\Type\UserdataType', array(
            'data_class' => Userdata::class,
        ))
        ->add('addresses', 'AppBundle\Form\Type\AddressesType', array(
            'data_class' => Addresses::class,
        ))
        ->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event){
            $user = $event->getForm()->get('user')->getData();
            $address = $event->getForm()->get('addresses')->getData();
            $address->setSalutation($user->getSalutation());
        })
        ->getForm();

    $register->handleRequest($request);

    if ($register->isSubmitted()) {

        // do stuff
    }
    return $this->render('form/login_index.html.twig', [
        'register' => $register->createView()
    ]);
}

In this example:

$user = $event->getForm()->get('user')->getData();
$address = $event->getForm()->get('addresses')->getData();
$address->setSalutation($user->getSalutation());

Upvotes: 0

Views: 509

Answers (1)

You should integrate the object you are working on as a parameter for your createFormBuilder($object) method. For example:

$user = new User();
$form = $formFactory
    ->createBuilder($user)
    ->add('username', TextType::class);

And then you add your subscriber, in this case the $event->getData() is an object of the class User

$form->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
        /** @var User $user */
        $user = $event->getData();
        $form = $event->getForm();

        // Your logic here ...
})->getForm();

UPDATE:

If you have an embedded form (property in relation with the parent class), example UserInformations you can simply make a call with:

$form
     ->add('informations', UserInformationType::class)
     ->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {

        /** @var User $user */
        $user = $event->getData();
        /** @var UserInformation $userInformation */
        $userInformation = $user->getInformation();

        $form = $event->getForm();

        // Your logic here ...
})->getForm();

Good luck.

Upvotes: 1

Related Questions