Search code examples
symfonysymfony-formssymfony-2.8

Understanding Forms Events - Symfony


lets say i have form like follow in my controller

$data = [];
    $form = $this->createFormBuilder($data)
            ->add('username', 'text', [ 'mapped' => FALSE, 'required' => FALSE ])
            ->add('show_email', 'checkbox', [ 'mapped' => FALSE, 'required' => FALSE ])
            ->add('submit', 'submit')
            ->addEventListener(\Symfony\Component\Form\FormEvents::PRE_SUBMIT, function($event){
                $user = $event->getData();
                $form = $event->getForm();

                if (true == $user['show_email']) {
                    $form->add('email', 'email', [
                        'required' => FALSE,
                         'data' => '[email protected]'
                    ]); 
                }

                $form->setData($user);
            })
            ->getForm()
            ;
    $form->handleRequest($request);

and I am listening to the PRE_SUBMIT event to add email field when a user checks the show_email.During the PRE_SUBMIT, the email field added successfully but when I am trying assign data in that field it is not shown in the form view. In the example, i use 'data' => '[email protected]' to add value to that email field, but that value is not populating in the email field. so what mistake I made here?


Solution

  • I solved this issue by adding email field value to the event data, like $data['email'] = "[email protected]", then reassign the event data $event->setData($data) again.

     ->addEventListener(\Symfony\Component\Form\FormEvents::PRE_SUBMIT, function($event){
    
                    $form = $event->getForm();
                    $data = $event->getData();
    
                    if(isset($data['showEmail']) && $data['showEmail'] == TRUE){
                        $form->add('email', 'email', [
                           'mapped' => FALSE ,
                        ]);
                        $data['email'] = "[email protected]";
                    }
                    else
                    {
                        unset($data['email']);
                    }
    
                    $event->setData($data);
                })