/** * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('added', 'oro_entity_identifier', ['class' => $options['class'], 'multiple' => true])->add('removed', 'oro_entity_identifier', ['class' => $options['class'], 'multiple' => true]); if ($options['extend']) { $em = $this->entityManager; $class = $options['class']; $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use($em, $class) { $data = $event->getData(); $repository = $em->getRepository($class); $targetData = $event->getForm()->getParent()->getData(); $fieldName = $event->getForm()->getName(); if (!empty($data['added'])) { foreach (explode(',', $data['added']) as $id) { $entity = $repository->find($id); if ($entity) { FieldAccessor::addValue($targetData, $fieldName, $entity); } } } if (!empty($data['removed'])) { foreach (explode(',', $data['removed']) as $id) { $entity = $repository->find($id); if ($entity) { FieldAccessor::removeValue($targetData, $fieldName, $entity); } } } }); } }
public function testAddAndRemoveValue() { $entity = new FieldAccessorTestEntity(); $this->assertCount(0, $entity->getRelatedEntities()); $this->assertCount(0, $entity->getAnotherRelatedEntities()); $relatedEntity1 = new DemoEntity(1); $relatedEntity2 = new DemoEntity(2); FieldAccessor::addValue($entity, 'related_entity', $relatedEntity1); FieldAccessor::addValue($entity, 'anotherRelatedEntity', $relatedEntity2); $this->assertCount(1, $entity->getRelatedEntities()); $this->assertSame($relatedEntity1, $entity->getRelatedEntities()->first()); $this->assertCount(1, $entity->getAnotherRelatedEntities()); $this->assertSame($relatedEntity2, $entity->getAnotherRelatedEntities()->first()); FieldAccessor::removeValue($entity, 'related_entity', $relatedEntity1); FieldAccessor::removeValue($entity, 'anotherRelatedEntity', $relatedEntity2); $this->assertCount(0, $entity->getRelatedEntities()); $this->assertCount(0, $entity->getAnotherRelatedEntities()); }