123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- <?php
- namespace Gedmo\Loggable\Entity\Repository;
- use Gedmo\Tool\Wrapper\EntityWrapper;
- use Doctrine\ORM\EntityRepository;
- use Gedmo\Loggable\LoggableListener;
- /**
- * The LogEntryRepository has some useful functions
- * to interact with log entries.
- *
- * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
- * @package Gedmo\Loggable\Entity\Repository
- * @subpackage LogEntryRepository
- * @link http://www.gediminasm.org
- * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
- */
- class LogEntryRepository extends EntityRepository
- {
- /**
- * Currently used loggable listener
- *
- * @var LoggableListener
- */
- private $listener;
- /**
- * Loads all log entries for the
- * given $entity
- *
- * @param object $entity
- * @return array
- */
- public function getLogEntries($entity)
- {
- $q = $this->getLogEntriesQuery($entity);
- return $q->getResult();
- }
- /**
- * Get the query for loading of log entries
- *
- * @param object $entity
- * @return Query
- */
- public function getLogEntriesQuery($entity)
- {
- $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 .= " ORDER BY log.version DESC";
- $objectId = $wrapped->getIdentifier();
- $q = $this->_em->createQuery($dql);
- $q->setParameters(compact('objectId', 'objectClass', 'order'));
- 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);
- }
- }
- /**
- * Get the currently used LoggableListener
- *
- * @throws \Gedmo\Exception\RuntimeException - if listener is not found
- * @return LoggableListener
- */
- private function getLoggableListener()
- {
- if (is_null($this->listener)) {
- foreach ($this->_em->getEventManager()->getListeners() as $event => $listeners) {
- foreach ($listeners as $hash => $listener) {
- if ($listener instanceof LoggableListener) {
- $this->listener = $listener;
- break;
- }
- }
- if ($this->listener) {
- break;
- }
- }
- if (is_null($this->listener)) {
- throw new \Gedmo\Exception\RuntimeException('The loggable listener could not be found');
- }
- }
- return $this->listener;
- }
- }
|