public function process() { if ($this->component instanceof IControl && $this->component->isOmitted()) { return; } $data = $this->component instanceof MultiChoiceControl ? $this->component->getValue() : $this->component->getValues(TRUE); $associationMapping = $this->wrappedEntity->getMetadata()->getAssociationMapping($this->component->name); $this->type = $associationMapping['type']; $targetEntityMetadata = $this->entityManager->getClassMetadata($associationMapping['targetEntity']); $this->processIdentifier($targetEntityMetadata); $this->prepareCollection(); $targetEntityRepository = $this->entityManager->getRepository($associationMapping['targetEntity']); foreach ($data as $rowKey => $row) { $newEntity = NULL; if (is_array($row)) { $values = $this->getIdentifierValues($row); if ($values && !($newEntity = $this->popByIdentifier($values)) && $this->type == ClassMetadata::MANY_TO_MANY) { $newEntity = $targetEntityRepository->findOneBy($values); } if (!$newEntity) { $newEntity = $targetEntityMetadata->newInstance(); } $this->mapper->saveValues($this->component[$rowKey], $newEntity); } elseif ($row) { $currentValue = $this->component instanceof MultiChoiceControl ? $row : $rowKey; if (!$this->popByIdentifier([$currentValue])) { $newEntity = $targetEntityRepository->find($currentValue); } } if ($newEntity) { $this->addEntity($newEntity); } } foreach ($this->forRemoval as $entityForRemove) { $this->collection->removeElement($entityForRemove); } $this->mapper->execute(function () { $this->updateCollection(); }); $this->validate(); }