/** * @param $object * @param Log $logEntry * @param LoggableAdapter $ea * @return bool */ protected function addChangeSet($object, Log $logEntry, LoggableAdapter $ea) { if (!$object instanceof ScheduledChangeable) { return false; } $date = $object->getScheduledChangeDate(); if ($date == null) { return false; } if ($object instanceof ScheduledChangeablePartially) { $intersect = array_intersect($object->getFieldsToSchedule(), array_keys($logEntry->getOldData())); if (count($intersect) == 0) { //no fields changed that are changeable return false; } } $object->removeScheduledChangeDate(); $om = $ea->getObjectManager(); /* @var $om EntityManager */ $uow = $om->getUnitOfWork(); $meta = $om->getClassMetadata(get_class($object)); $hash = spl_object_hash($object); $data = $logEntry->getData(); $oldData = $logEntry->getOldData(); if ($logEntry->getAction() == self::ACTION_REMOVE) { //MANY_TO_ONE foreach ($meta->getAssociationMappings() as $associationMapping) { if ($associationMapping['type'] != \Doctrine\ORM\Mapping\ClassMetadata::MANY_TO_ONE) { continue; } $one = $meta->getReflectionProperty($associationMapping['fieldName'])->getValue($object); if (array_key_exists('inversedBy', $associationMapping)) { $field = $associationMapping['inversedBy']; $associationMeta = $om->getClassMetadata($associationMapping['targetEntity']); $associationMeta->getReflectionProperty($field)->getValue($one)->add($object); } } $om->persist($object); $uow->clearEntityChangeSet($hash); } else { if ($logEntry->getAction() == self::ACTION_CREATE) { //MANY_TO_ONE foreach ($logEntry->getParents() as $parent) { $one = $om->getReference($parent->getObjectClass(), $parent->getObjectId()); $associationMapping = $meta->getAssociationMapping($parent->getFieldName()); if (array_key_exists('inversedBy', $associationMapping)) { $field = $associationMapping['inversedBy']; $associationMeta = $om->getClassMetadata($parent->getObjectClass()); $associationMeta->getReflectionProperty($field)->getValue($one)->removeElement($object); } } $om->remove($object); $uow->clearEntityChangeSet($hash); } else { // $undoSet = array(); $uow->clearEntityChangeSet($hash); foreach ($logEntry->getOldData() as $field => $oldValue) { if ($object instanceof ScheduledChangeablePartially && !in_array($field, $object->getFieldsToSchedule())) { $value = null; if (isset($data[$field])) { $value = $data[$field]; } $uow->propertyChanged($object, $field, $oldValue, $value); continue; } if ($meta->isSingleValuedAssociation($field)) { $mapping = $meta->getAssociationMapping($field); $oldValue = $oldValue ? $om->getReference($mapping['targetEntity'], $oldValue) : null; } $meta->getReflectionProperty($field)->setValue($object, $oldValue); $ea->setOriginalObjectProperty($uow, $hash, $field, $oldValue); // $undoSet[$field] = array(null,$oldValue); } // $uow->scheduleExtraUpdate($object,$undoSet); // $changeSetMeta = $ea->getObjectManager()->getClassMetadata(get_class($object)); // $uow->computeChangeSet($changeSetMeta, $object); } if ($object instanceof ScheduledChangeablePartially) { $changeSetDataKeys = array_keys($uow->getEntityChangeSet($object)); if (sizeof($changeSetDataKeys) > 0) { //partial $dataLog = $data; $dataLogOld = $oldData; $dataChangeSet = $data; $dataChangeSetOld = $oldData; foreach ($data as $key => $value) { if (!in_array($key, $changeSetDataKeys)) { unset($dataLog[$key]); unset($dataLogOld[$key]); } } foreach ($changeSetDataKeys as $field) { unset($dataChangeSet[$field]); unset($dataChangeSetOld[$field]); } $logEntry->setData($dataLog); $logEntry->setOldData($dataLogOld); $changeSet = $this->createChangeSet($logEntry, $date); $changeSet->setData($dataChangeSet); $changeSet->setOldData($dataChangeSetOld); $om->persist($changeSet); $changeSetMeta = $ea->getObjectManager()->getClassMetadata(get_class($changeSet)); $uow->computeChangeSet($changeSetMeta, $changeSet); //create log also return false; } } } $changeSet = $this->createChangeSet($logEntry, $date); $om->persist($changeSet); $changeSetMeta = $ea->getObjectManager()->getClassMetadata(get_class($changeSet)); $uow->computeChangeSet($changeSetMeta, $changeSet); return true; }