简体   繁体   中英

How to use unmapped field in Symfony form to adjust data post submit?

I have two fields in my entity contractLength and contractEndDate . The aim is to be able to specify EITHER a contractLength OR a contractEndDate .

To accomplish this I have added an unmapped field to the form useBespokeEndDate , of checkbox type.

I want to be able in the form class ContractType to listen for the submit event and then check if the checkbox is ticked, if it is then proceed as normal but if it is not ticked (so we are using contractLength ) then set the contractEndDate field to null .

I believe I should be using Event Listeners as detailed here http://symfony.com/doc/master/form/dynamic_form_modification.html#customizing-your-form-based-on-the-underlying-data (under the Dynamic Generation for Submitted Forms heading) to listen for the POST_SUBMIT event and then check the value of useBespokeEndDate and then modify the data as appropriate. However, I'm confused as to how exactly to get the form data for the unmapped field and then to also modify the actual data of the form.

My buildForm method in ContractType.php

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('useBespokeEndDate', CheckboxType::class, array(
            'label' => 'Use Bespoke Contract End Date?',
            'empty_data' => false,
            'mapped' => false
        ))
        ->add('contractLength', ChoiceType::class, array(
            'choices' => array(12 => 12, 24 => 24, 36 => 36, 48 => 48, 60 => 60),
            'label' => 'Contract Length (months)'
        ))
        ->add('contractEndDate', DateType::class, array('label' => 'Contract End Date'))
        ->add('save', SubmitType::class, array('label' => 'Save'));

    $builder->addEventListener(FormEvents::POST_SUBMIT,
        // Do something here to modify the data    
    );
}

I've got a similar situation where I have an option field, it's use (and therefore value) depending on a radio button group.

Rather than making a dynamic form, I instead separated the form from the entity, and actually ended up created a sub-form (Type) that had its own data_class Form configuration option and Data Mappers to convert the value objects to the entities.

There are useful blog posts with more information about Value Objects in forms and Creating a Custom Data Mapper for Symfony Forms .

For me, this alos gives the advantage of moving some quite complex checks into their own smaller class, and making the code more reusable.

Had the same problem, and I could access the unmapped values this way :

// in your POST_SUBMIT callback :
$form = $event->getForm();
$contract = $event->getData();

// get the unmapped value :
$useBespokeEndDate = $form->get('useBespokeEndDate')->getData(); 
// .. continue

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM