/** * Modifies form based on submitted data * * @param FormEvent $event */ public function preSubmit(FormEvent $event) { $form = $event->getForm(); /** @var Integration $originalData */ $originalData = $form->getData(); $data = $event->getData(); $this->muteFields($form, $originalData); if (!empty($data['type'])) { $type = $data['type']; $transportTypeModifier = $this->getTransportTypeModifierClosure($type); $transportTypeModifier($form); $connectorsModifier = $this->getConnectorsModifierClosure($type); $connectorsModifier($form); $synchronizationSettingsModifier = $this->getDynamicModifierClosure($type, 'synchronization_settings'); $synchronizationSettingsModifier($form); $mappingSettingsModifier = $this->getDynamicModifierClosure($type, 'mapping_settings'); $mappingSettingsModifier($form); // value that was set on postSet is replaced by null from request $typeChoices = array_keys($form->get('transportType')->getConfig()->getOption('choices')); $firstChoice = reset($typeChoices); $data['transportType'] = isset($data['transportType']) ? $data['transportType'] : $firstChoice; /* * If transport type changed we have to modify ViewData(it's already saved entity) * due to it's not matched the 'data_class' option of newly added form type */ if ($originalData !== null && ($transport = $originalData->getTransport())) { $transportType = $this->registry->getTransportTypeBySettingEntity($transport, $originalData->getType(), true); // second condition cover case when we have same name for few integration types if ($transportType !== $data['transportType'] || $originalData->getType() !== $data['type']) { /** @var Integration $setEntity */ $setEntity = $form->getViewData(); $setEntity->clearTransport(); } } $transportModifier = $this->getTransportModifierClosure($type, $data['transportType']); $transportModifier($form); $event->setData($data); } }