snoop168
snoop168

Reputation: 404

Symfony3 get the value of a non mapped field in event listener

Trying to make a form that a user chooses an option and depending on their choice loads additional fields. So far I have a UserSignupType:

class UserSignupType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('userType', ChoiceType::class, array(
                'choices' => array(
                    "Subscriber" => "Subscriber",
                    "Friend" => "Friend"
                    ),
                'expanded' => true,
                'mapped' => false
                ));

        $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function (FormEvent $event) {
                $form = $event->getForm();

                $usertype = $form->get('userType')->getData(); //updated per JBaffords answer

                if($userType == "Subscriber")
                {
                    $builder->add('agency', EntityType::class, array(
                        "class" => "\AppBundle\Entity\Agency",
                        "label" => "name"));
                }
                elseif($userType == "Friend")
                {
                    $builder->add('phoneNumber', PhoneNumberType::class, array(
                        'default_region' => 'US',
                        'format' => PhoneNumberFormat::NATIONAL));
                }
            }
        );
    }

    // ...
}

not sure if the getData method is the right method to use, and if it is, i need to somehow get the "userType" field out of it. I cant call getUserType because its not an actual mapped property and I don't want it to be. It simply decides the fields to show.

Upvotes: 3

Views: 2369

Answers (1)

jbafford
jbafford

Reputation: 5668

You can get the value for any form element (mapped or unmapped) by doing:

$form->get('fieldName')->getData();

get() returns a Form object, so if you have a nested form, you can continue to call ->get('nextFieldName') on each child until you get to the form element you need.

The value returned from getData for a form is going to depend on (amont other things) the mapping of its child elements. If the form has no children, then its value is its value; the mapping just determines whether that value is populated into its parent's data.

In your specific case, to get the data for the userType element, you would do:

$userType = $form->get('userType')->getData();

Upvotes: 1

Related Questions