/**
  * Get log entries
  * 
  * @access public
  * @param array $entities ,default is empty array
  * @param array $objectIds ,default is empty array
  * @param string $objectClass ,default is null
  * @param int $status ,default is null
  * @return array log entries array
  */
 public function getLogEntries($entities = array(), $objectIds = array(), $objectClass = null, $status = null)
 {
     $parameters = array();
     $queryBuilder = $this->createQueryBuilder("log");
     $queryBuilder->select("log")->addOrderBy('log.version', Criteria::DESC)->addOrderBy('log.id', Criteria::DESC);
     if (count($entities) > 0) {
         // assuming array of entities belong to them class
         $entity = reset($entities);
         $objectIds = array();
         $wrapped = new EntityWrapper($entity, $this->getEntityManager());
         $objectClass = $wrapped->getMetadata()->name;
         // collect entitites ids
         array_shift($entities);
         $objectIds[] = $wrapped->getIdentifier();
         foreach ($entities as $entity) {
             $wrapped = new EntityWrapper($entity, $this->getEntityManager());
             $objectIds[] = $wrapped->getIdentifier();
         }
     }
     if (!is_null($status)) {
         $parameters["objectStatus"] = $status;
         $queryBuilder->andWhere($queryBuilder->expr()->eq('log.objectStatus', ":objectStatus"));
     }
     if (!is_null($objectClass)) {
         $parameters["objectClass"] = $objectClass;
         $queryBuilder->andWhere($queryBuilder->expr()->eq('log.objectClass', ":objectClass"));
     }
     if (count($objectIds) > 0) {
         $parameters["objectIds"] = $objectIds;
         $queryBuilder->andWhere($queryBuilder->expr()->in('log.objectId', ":objectIds"));
     }
     $queryBuilder->setParameters($parameters);
     return $queryBuilder->getQuery()->getResult();
 }
 public function testDetachedProxy()
 {
     $test = $this->em->getReference(self::ARTICLE, array('id' => 1));
     $this->em->clear();
     $wrapped = new EntityWrapper($test, $this->em);
     $this->assertEquals(1, $wrapped->getIdentifier());
     $this->assertEquals('test', $wrapped->getPropertyValue('title'));
 }
Beispiel #3
0
 public function getLogEntriesQueryBuilder($entity)
 {
     $wrapped = new EntityWrapper($entity, $this->_em);
     $objectClass = $wrapped->getMetadata()->name;
     $objectId = $wrapped->getIdentifier();
     $qb = $this->createQueryBuilder('a')->where('a.objectId = :objectId AND a.objectClass = :objectClass')->orderBy('a.loggedAt', 'DESC')->setParameters(compact('objectId', 'objectClass'));
     return $qb;
 }
Beispiel #4
0
 public function nullifyLogEntry($entity, $rootVersion)
 {
     $wrapped = new EntityWrapper($entity, $this->_em);
     $objectClass = $wrapped->getMetadata()->name;
     $objectId = $wrapped->getIdentifier();
     $logEntry = $this->findOneBy(compact('objectId', 'objectClass', 'rootVersion'));
     if ($logEntry) {
         $logEntry->setData(null);
         $this->getEntityManager()->flush($logEntry);
     }
 }
 /**
  * Get the query for loading of log entries
  *
  * @param object  $entity
  * @param integer $rootVersion
  *
  * @return Query
  */
 public function getLogEntriesQueryRoot($entity, $rootVersion = null)
 {
     $wrapped = new EntityWrapper($entity, $this->_em);
     $objectClass = $wrapped->getMetadata()->name;
     $meta = $this->getClassMetadata();
     $dql = "SELECT log FROM {$meta->name} log";
     $dql .= " WHERE log.objectId = :objectId";
     $dql .= " AND log.objectClass = :objectClass";
     $dql .= " AND log.rootVersion <= :rootVersion";
     $dql .= " ORDER BY log.version DESC";
     $objectId = $wrapped->getIdentifier();
     $q = $this->_em->createQuery($dql);
     $q->setParameters(compact('objectId', 'objectClass', 'rootVersion'));
     return $q;
 }
 /**
  * Reverts given $entity to $revision by
  * restoring all fields from that $revision.
  * After this operation you will need to
  * persist and flush the $entity.
  *
  * @param object $entity
  * @param integer $version
  * @throws \Gedmo\Exception\UnexpectedValueException
  * @return void
  */
 public function revert($entity, $version = 1)
 {
     $wrapped = new EntityWrapper($entity, $this->_em);
     $objectMeta = $wrapped->getMetadata();
     $objectClass = $objectMeta->name;
     //$objectMeta = $this->_em->getClassMetadata($objectClass);
     $meta = $this->getClassMetadata();
     $dql = "SELECT log FROM {$meta->name} log";
     $dql .= " WHERE log.objectId = :objectId";
     $dql .= " AND log.objectClass = :objectClass";
     $dql .= " AND log.version <= :version";
     $dql .= " ORDER BY log.version ASC";
     $objectId = $wrapped->getIdentifier();
     $q = $this->_em->createQuery($dql);
     $q->setParameters(compact('objectId', 'objectClass', 'version'));
     $logs = $q->getResult();
     if ($logs) {
         $config = $this->getLoggableListener()->getConfiguration($this->_em, $objectMeta->name);
         $fields = $config['versioned'];
         $filled = false;
         while (($log = array_pop($logs)) && !$filled) {
             if ($data = $log->getData()) {
                 foreach ($data as $field => $value) {
                     if (in_array($field, $fields)) {
                         if ($objectMeta->isSingleValuedAssociation($field)) {
                             $mapping = $objectMeta->getAssociationMapping($field);
                             $value = $value ? $this->_em->getReference($mapping['targetEntity'], $value) : null;
                         }
                         $wrapped->setPropertyValue($field, $value);
                         unset($fields[array_search($field, $fields)]);
                     }
                 }
             }
             $filled = count($fields) === 0;
         }
         /*if (count($fields)) {
               throw new \Gedmo\Exception\UnexpectedValueException('Could not fully revert the entity to version: '.$version);
           }*/
     } else {
         throw new \Gedmo\Exception\UnexpectedValueException('Could not find any log entries under version: ' . $version);
     }
 }
 /**
  * Loads all translations with all translatable
  * fields from the given entity
  *
  * @param object $entity Must implement Translatable
  * @return array list of translations in locale groups
  */
 public function findTranslations($entity)
 {
     $result = array();
     $wrapped = new EntityWrapper($entity, $this->_em);
     if ($wrapped->hasValidIdentifier()) {
         $entityId = $wrapped->getIdentifier();
         $entityClass = $wrapped->getMetadata()->name;
         $translationMeta = $this->getClassMetadata();
         // table inheritance support
         $qb = $this->_em->createQueryBuilder();
         $qb->select('trans.content, trans.field, trans.locale')->from($translationMeta->rootEntityName, 'trans')->where('trans.foreignKey = :entityId', 'trans.objectClass = :entityClass')->orderBy('trans.locale');
         $q = $qb->getQuery();
         $data = $q->execute(compact('entityId', 'entityClass'), Query::HYDRATE_ARRAY);
         if ($data && is_array($data) && count($data)) {
             foreach ($data as $row) {
                 $result[$row['locale']][$row['field']] = $row['content'];
             }
         }
     }
     return $result;
 }
 /**
  * Removes given $node from the tree and reparents its descendants
  *
  * @todo: may be improved, to issue single query on reparenting
  * @param object $node
  * @throws RuntimeException - if something fails in transaction
  * @return void
  */
 public function removeFromTree($node)
 {
     $meta = $this->getClassMetadata();
     if (!$node instanceof $meta->name) {
         throw new InvalidArgumentException("Node is not related to this repository");
     }
     $wrapped = new EntityWrapper($node, $this->_em);
     if (!$wrapped->hasValidIdentifier()) {
         throw new InvalidArgumentException("Node is not managed by UnitOfWork");
     }
     $config = $this->listener->getConfiguration($this->_em, $meta->name);
     $pk = $meta->getSingleIdentifierFieldName();
     $nodeId = $wrapped->getIdentifier();
     $parent = $wrapped->getPropertyValue($config['parent']);
     $dql = "SELECT node FROM {$config['useObjectClass']} node";
     $dql .= " WHERE node.{$config['parent']} = :node";
     $q = $this->_em->createQuery($dql);
     $q->setParameters(compact('node'));
     $nodesToReparent = $q->getResult();
     // process updates in transaction
     $this->_em->getConnection()->beginTransaction();
     try {
         foreach ($nodesToReparent as $nodeToReparent) {
             $id = $meta->getReflectionProperty($pk)->getValue($nodeToReparent);
             $meta->getReflectionProperty($config['parent'])->setValue($nodeToReparent, $parent);
             $dql = "UPDATE {$config['useObjectClass']} node";
             $dql .= " SET node.{$config['parent']} = :parent";
             $dql .= " WHERE node.{$pk} = :id";
             $q = $this->_em->createQuery($dql);
             $q->setParameters(compact('parent', 'id'));
             $q->getSingleScalarResult();
             $this->listener->getStrategy($this->_em, $meta->name)->updateNode($this->_em, $nodeToReparent, $node);
             $oid = spl_object_hash($nodeToReparent);
             $this->_em->getUnitOfWork()->setOriginalEntityProperty($oid, $config['parent'], $parent);
         }
         $dql = "DELETE {$config['useObjectClass']} node";
         $dql .= " WHERE node.{$pk} = :nodeId";
         $q = $this->_em->createQuery($dql);
         $q->setParameters(compact('nodeId'));
         $q->getSingleScalarResult();
         $this->_em->getConnection()->commit();
     } catch (\Exception $e) {
         $this->_em->close();
         $this->_em->getConnection()->rollback();
         throw new \Gedmo\Exception\RuntimeException('Transaction failed', null, $e);
     }
     // remove from identity map
     $this->_em->getUnitOfWork()->removeFromIdentityMap($node);
     $node = null;
 }
Beispiel #9
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());
 }
Beispiel #11
0
 /**
  * @see getChildrenQueryBuilder
  */
 public function childrenWithTranslations($node = null, $locale = null, $direct = false, $sortByField = null, $direction = 'ASC', $includeNode = false, $start = null, $limit = null)
 {
     $meta = $this->getClassMetadata();
     $config = $this->listener->getConfiguration($this->_em, $meta->name);
     $qb = $this->getQueryBuilder();
     $qb->select('node', 't')->from($config['useObjectClass'], 'node')->leftJoin('node.translations', 't');
     if ($node !== null) {
         if ($node instanceof $meta->name) {
             $wrapped = new EntityWrapper($node, $this->_em);
             if (!$wrapped->hasValidIdentifier()) {
                 throw new InvalidArgumentException("Node is not managed by UnitOfWork");
             }
             if ($direct) {
                 $id = $wrapped->getIdentifier();
                 $qb->where($id === null ? $qb->expr()->isNull('node.' . $config['parent']) : $qb->expr()->eq('node.' . $config['parent'], is_string($id) ? $qb->expr()->literal($id) : $id));
             } else {
                 $left = $wrapped->getPropertyValue($config['left']);
                 $right = $wrapped->getPropertyValue($config['right']);
                 if ($left && $right) {
                     $qb->where($qb->expr()->lt('node.' . $config['right'], $right))->andWhere($qb->expr()->gt('node.' . $config['left'], $left));
                 }
             }
             if (isset($config['root'])) {
                 $rootId = $wrapped->getPropertyValue($config['root']);
                 $qb->andWhere($rootId === null ? $qb->expr()->isNull('node.' . $config['root']) : $qb->expr()->eq('node.' . $config['root'], is_string($rootId) ? $qb->expr()->literal($rootId) : $rootId));
             }
             if ($includeNode) {
                 $idField = $meta->getSingleIdentifierFieldName();
                 $qb->where('(' . $qb->getDqlPart('where') . ') OR node.' . $idField . ' = :rootNode');
                 $qb->setParameter('rootNode', $node);
             }
         } else {
             throw new \InvalidArgumentException("Node is not related to this repository");
         }
     } else {
         if ($direct) {
             $qb->where($qb->expr()->isNull('node.' . $config['parent']));
         }
     }
     if (!$sortByField) {
         $qb->orderBy('node.' . $config['left'], 'ASC');
     } elseif (is_array($sortByField)) {
         $fields = '';
         foreach ($sortByField as $field) {
             $fields .= 'node.' . $field . ',';
         }
         $fields = rtrim($fields, ',');
         $qb->orderBy($fields, $direction);
     } else {
         if ($meta->hasField($sortByField) && in_array(strtolower($direction), array('asc', 'desc'))) {
             $qb->orderBy('node.' . $sortByField, $direction);
         } else {
             throw new InvalidArgumentException("Invalid sort options specified: field - {$sortByField}, direction - {$direction}");
         }
     }
     if ($start) {
         $qb->setFirstResult($start);
     }
     if ($limit) {
         $qb->setMaxResults($limit);
     }
     return $this->setTranslatableHint($qb->getQuery(), $locale);
 }
 /**
  * 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());
 }