/**
  * @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;
 }
Beispiel #2
0
    /**
     * Removes single node without touching children
     *
     * @internal
     * @param EntityWrapper $wrapped
     * @return void
     */
    private function removeSingle(EntityWrapper $wrapped)
    {
        $meta = $this->getClassMetadata();
        $config = $this->listener->getConfiguration($this->_em, $meta->name);

        $pk = $meta->getSingleIdentifierFieldName();
        $nodeId = $wrapped->getIdentifier();

        // prevent from deleting whole branch
        $dql = "UPDATE {$config['useObjectClass']} node";
        $dql .= ' SET node.' . $config['left'] . ' = 0,';
        $dql .= ' node.' . $config['right'] . ' = 0';
        $dql .= ' WHERE node.' . $pk . ' = ' . $nodeId;
        $this->_em->createQuery($dql)->getSingleScalarResult();

        // remove the node from database
        $dql = "DELETE {$config['useObjectClass']} node";
        $dql .= " WHERE node.{$pk} = {$nodeId}";
        $this->_em->createQuery($dql)->getSingleScalarResult();

        // remove from identity map
        $this->_em->getUnitOfWork()->removeFromIdentityMap($wrapped->getObject());
    }
 /**
  * Removes single node without touching children
  *
  * @internal
  *
  * @param EntityWrapper $wrapped
  */
 private function removeSingle(EntityWrapper $wrapped)
 {
     $meta = $this->getClassMetadata();
     $config = $this->listener->getConfiguration($this->getEntityManager(), $meta->name);
     $pk = $meta->getSingleIdentifierFieldName();
     $nodeId = $wrapped->getIdentifier();
     // prevent from deleting whole branch
     $qb = $this->getQueryBuilder();
     $qb->update($config['useObjectClass'], 'node')->set('node.' . $config['left'], 0)->set('node.' . $config['right'], 0);
     $qb->andWhere($qb->expr()->eq('node.' . $pk, ':id'));
     $qb->setParameter('id', $nodeId);
     $qb->getQuery()->getSingleScalarResult();
     // remove the node from database
     $qb = $this->getQueryBuilder();
     $qb->delete($config['useObjectClass'], 'node');
     $qb->andWhere($qb->expr()->eq('node.' . $pk, ':id'));
     $qb->setParameter('id', $nodeId);
     $qb->getQuery()->getSingleScalarResult();
     // remove from identity map
     $this->getEntityManager()->getUnitOfWork()->removeFromIdentityMap($wrapped->getObject());
 }
 /**
  * Removes single node without touching children
  *
  * @internal
  * @param EntityWrapper $wrapped
  * @return void
  */
 private function removeSingle(EntityWrapper $wrapped)
 {
     $meta = $this->getClassMetadata();
     $config = $this->listener->getConfiguration($this->_em, $meta->name);
     $pk = $meta->getSingleIdentifierFieldName();
     $nodeId = $wrapped->getIdentifier();
     // prevent from deleting whole branch
     $qb = $this->_em->createQueryBuilder();
     $qb->update($config['useObjectClass'], 'node')->set('node.' . $config['left'], 0)->set('node.' . $config['right'], 0)->where($nodeId === null ? $qb->expr()->isNull('node.' . $pk) : $qb->expr()->eq('node.' . $pk, is_string($nodeId) ? $qb->expr()->literal($nodeId) : $nodeId));
     $qb->getQuery()->getSingleScalarResult();
     // remove the node from database
     $qb = $this->_em->createQueryBuilder();
     $qb->delete($config['useObjectClass'], 'node')->where($nodeId === null ? $qb->expr()->isNull('node.' . $pk) : $qb->expr()->eq('node.' . $pk, is_string($nodeId) ? $qb->expr()->literal($nodeId) : $nodeId));
     $qb->getQuery()->getSingleScalarResult();
     // remove from identity map
     $this->_em->getUnitOfWork()->removeFromIdentityMap($wrapped->getObject());
 }