コード例 #1
0
 /**
  * @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;
 }