123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- <?php
- namespace Gedmo\Loggable\Document\Repository;
- use Gedmo\Tool\Wrapper\MongoDocumentWrapper;
- use Gedmo\Loggable\LoggableListener;
- use Doctrine\ODM\MongoDB\DocumentRepository,
- Doctrine\ODM\MongoDB\Cursor;
- /**
- * The LogEntryRepository has some useful functions
- * to interact with log entries.
- *
- * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
- * @package Gedmo\Loggable\Document\Repository
- * @subpackage LogEntryRepository
- * @link http://www.gediminasm.org
- * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
- */
- class LogEntryRepository extends DocumentRepository
- {
- /**
- * Currently used loggable listener
- *
- * @var LoggableListener
- */
- private $listener;
- /**
- * Loads all log entries for the
- * given $document
- *
- * @param object $document
- * @return array
- */
- public function getLogEntries($document)
- {
- $wrapped = new MongoDocumentWrapper($document, $this->dm);
- $objectId = $wrapped->getIdentifier();
- $qb = $this->createQueryBuilder();
- $qb->field('objectId')->equals($objectId);
- $qb->field('objectClass')->equals($wrapped->getMetadata()->name);
- $qb->sort('version', 'DESC');
- $q = $qb->getQuery();
- $result = $q->execute();
- if ($result instanceof Cursor) {
- $result = $result->toArray();
- }
- return $result;
- }
- /**
- * Reverts given $document to $revision by
- * restoring all fields from that $revision.
- * After this operation you will need to
- * persist and flush the $document.
- *
- * @param object $document
- * @param integer $version
- * @throws \Gedmo\Exception\UnexpectedValueException
- * @return void
- */
- public function revert($document, $version = 1)
- {
- $wrapped = new MongoDocumentWrapper($document, $this->dm);
- $objectMeta = $wrapped->getMetadata();
- $meta = $this->getClassMetadata();
- $objectId = $wrapped->getIdentifier();
- $qb = $this->createQueryBuilder();
- $qb->field('objectId')->equals($objectId);
- $qb->field('objectClass')->equals($objectMeta->name);
- $qb->field('version')->lte($version);
- $qb->sort('version', 'ASC');
- $q = $qb->getQuery();
- $logs = $q->execute();
- if ($logs instanceof Cursor) {
- $logs = $logs->toArray();
- }
- if ($logs) {
- $config = $this->getLoggableListener()->getConfiguration($this->dm, $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->getFieldMapping($field);
- $value = $value ? $this->dm->getReference($mapping['targetDocument'], $value) : null;
- }
- $wrapped->setPropertyValue($field, $value);
- unset($fields[array_search($field, $fields)]);
- }
- }
- }
- $filled = count($fields) === 0;
- }
- /*if (count($fields)) {
- throw new \Gedmo\Exception\UnexpectedValueException('Cound not fully revert the document to version: '.$version);
- }*/
- } else {
- throw new \Gedmo\Exception\UnexpectedValueException('Count 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->dm->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;
- }
- }
|