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();
}