/** * @param Log $logEntry * @param \DateTime $date * @return ChangeSet */ private function createChangeSet(Log $logEntry, \DateTime $date) { $changeSet = new ChangeSet(); $changeSet->setChangeAt($date); $changeSet->setObjectId($logEntry->getObjectId()); $changeSet->setObjectClass($logEntry->getObjectClass()); $changeSet->setData($logEntry->getData()); $changeSet->setOldData($logEntry->getOldData()); $changeSet->setUsername($logEntry->getUsername()); $changeSet->setAction($logEntry->getAction()); return $changeSet; }
/** * @param ChangeSet $changeset * @return bool|object */ public function applyChangeSet(ChangeSet $changeset) { $now = new \DateTime(); if ($changeset->getChangeAt() == null || $changeset->getChangeAt()->diff($now)->invert) { return false; } if ($changeset->getAction() == LoggableListener::ACTION_CREATE && $changeset->getObjectId() != null) { throw new \Exception("changeSet invalid {$changeset->getId()} create with object id"); } if ($changeset->getAction() != LoggableListener::ACTION_CREATE && $changeset->getObjectId() == null) { throw new \Exception("changeSet invalid {$changeset->getId()} no objectId found but no create Action"); } $data = $changeset->getData(); if ($changeset->getObjectId() == null) { //create a new one $r = new \ReflectionClass($changeset->getObjectClass()); $entity = $r->newInstanceWithoutConstructor(); } else { //edit $entity = $this->_em->find($changeset->getObjectClass(), $changeset->getObjectId()); } if ($changeset->getAction() == LoggableListener::ACTION_REMOVE) { //very rudimental remove... dont care about sitdeffects $this->_em->remove($entity); $this->_em->remove($changeset); $this->_em->flush(); return true; } $wrapped = new EntityWrapper($entity, $this->_em); $objectMeta = $wrapped->getMetadata(); foreach ($data as $field => $value) { if ($objectMeta->isSingleValuedAssociation($field)) { $mapping = $objectMeta->getAssociationMapping($field); $value = $value ? $this->_em->getReference($mapping['targetEntity'], $value) : null; } if (property_exists($changeset->getObjectClass(), $field)) { $wrapped->setPropertyValue($field, $value); } } if ($changeset->getObjectId() == null) { //MANY_TO_ONE create new one foreach ($objectMeta->getAssociationMappings() as $associationMapping) { if ($associationMapping['type'] != \Doctrine\ORM\Mapping\ClassMetadata::MANY_TO_ONE) { continue; } $one = $objectMeta->getReflectionProperty($associationMapping['fieldName'])->getValue($entity); if (array_key_exists('inversedBy', $associationMapping)) { $field = $associationMapping['inversedBy']; $associationMeta = $this->_em->getClassMetadata($associationMapping['targetEntity']); $associationMeta->getReflectionProperty($field)->getValue($one)->add($entity); } } } $object = $wrapped->getObject(); $object->removeScheduledChangeDate(); $this->_em->persist($object); $this->_em->remove($changeset); $this->_em->flush(); return $object; }