public function preSubmitData(FormEvent $event) { list($entityId, $model) = $this->prepareEvent($event); $saved = []; if ($entityId) { $saved = $this->relations->findByFieldId($model->getId(), $entityId); array_walk($saved, function (&$item) { $item = $item->getOption()->getId(); }); } $data = $event->getData(); if (empty($data)) { $data = []; } if (!is_array($data)) { $data = [$data]; } if ($entityId) { /** * Save selected options */ $toSave = array_intersect($data, $saved); foreach ($data as $option) { if (!in_array($option, $saved)) { $optionRelation = new OptionSetRelation(); $optionRelation->setData(null, $entityId, $model, $this->options->find($option)); $toSave[] = $option; $this->em->persist($optionRelation); } } /** * Remove unselected */ if ($entityId && $this->relations->count($model->getId(), $entityId)) { $toRemove = $this->relations->findByNotIn($model->getId(), $entityId, $toSave); foreach ($toRemove as $option) { $this->em->remove($option); } } } }
/** * PRE_SUBMIT event handler * * @param FormEvent $event */ public function preSubmitData(FormEvent $event) { $entityId = $this->getEntityId($event); if ($entityId) { $configFieldModel = $this->configManager->getConfigFieldModel($event->getForm()->getConfig()->getOption('entityClassName'), $event->getForm()->getConfig()->getOption('entityFieldName')); $savedOptionIds = $this->getSavedOptionIds($configFieldModel, $entityId); $data = $event->getData(); if (empty($data)) { $data = []; } if (!is_array($data)) { $data = [$data]; } /** * Save selected options */ $toSave = array_intersect($data, $savedOptionIds); foreach ($data as $option) { if (!in_array($option, $savedOptionIds)) { $optionRelation = new OptionSetRelation(); $optionRelation->setData(null, $entityId, $configFieldModel, $this->options->find($option)); $toSave[] = $option; $this->em->persist($optionRelation); } } /** * Remove unselected */ if ($entityId && $this->relations->count($configFieldModel->getId(), $entityId)) { $toRemove = $this->relations->findByNotIn($configFieldModel->getId(), $entityId, $toSave); foreach ($toRemove as $option) { $this->em->remove($option); } } } }