/** * Returns an array with the log entries of the given action with a limiter for the paging. It is used for the content workflow overview. * The log entries are filtered by the page object. * * @param string $action * @param int $offset * @param int $limit * * @return array $result */ public function getLogs($action = '', $offset, $limit) { $result = array(); $qb = $this->em->createQueryBuilder(); $sqb = $this->em->createQueryBuilder(); $qb->select('l.objectId, l.action, l.loggedAt, l.version, l.username')->from('Cx\\Core\\ContentManager\\Model\\Entity\\LogEntry', 'l')->where('l.action = :action')->andWhere('l.objectClass = :objectClass')->andWhere($qb->expr()->eq('l.version', '(' . $sqb->select('MAX(sl.version) AS version')->from('Cx\\Core\\ContentManager\\Model\\Entity\\LogEntry', 'sl')->where($sqb->expr()->eq('l.objectId', 'sl.objectId'))->getDQL() . ')'))->orderBy('l.loggedAt', 'DESC')->setParameter('objectClass', 'Cx\\Core\\ContentManager\\Model\\Entity\\Page'); switch ($action) { case 'deleted': $qb->setParameter('action', 'remove'); break; case 'unvalidated': $editingStatus = 'hasDraftWaiting'; $qb->orWhere('l.action = :orAction')->setParameter('action', 'create')->setParameter('orAction', 'update'); break; case 'updated': $editingStatus = ''; $qb->setParameter('action', 'update'); break; default: // create $editingStatus = ''; $qb->setParameter('action', 'create'); } switch ($action) { case 'deleted': $qb->setFirstResult($offset)->setMaxResults($limit); $logs = $qb->getQuery()->getResult(); $logsByNodeId = array(); // Structure the logs by node id and language foreach ($logs as $log) { $page = new \Cx\Core\ContentManager\Model\Entity\Page(); $page->setId($log['objectId']); $this->revert($page, $log['version'] - 1); $result[$page->getNodeIdShadowed()][$page->getLang()] = $log; } break; default: // create, update and unvalidated // If setFirstResult() is called, setMaxResult must be also called. Otherwise there is a fatal error. // The parameter for setMaxResult() method is a custom value set to 999999, because we need all pages. $qb->setFirstResult($offset)->setMaxResults(999999); $logs = $qb->getQuery()->getResult(); $i = 0; foreach ($logs as $log) { $page = $this->pageRepo->findOneById($log['objectId']); if (!$page) { continue; } if ($page->getEditingStatus() == $editingStatus) { $result[] = $log; $i++; } if ($i >= $limit) { break; } } } return $result; }
/** * Returns an array with the page translations of the given page id. * * @param int $pageId * @param int $historyId If the page does not exist, we need the history id to revert them. */ public function getPageTranslations($pageId, $historyId) { $pages = array(); $pageTranslations = array(); $currentPage = $this->findOneById($pageId); // If page is deleted if (!is_object($currentPage)) { $currentPage = new \Cx\Core\ContentManager\Model\Entity\Page(); $currentPage->setId($pageId); $logRepo = $this->em->getRepository('Cx\\Core\\ContentManager\\Model\\Entity\\LogEntry'); $logRepo->revert($currentPage, $historyId); $logs = $logRepo->getLogsByAction('remove'); foreach ($logs as $log) { $page = new \Cx\Core\ContentManager\Model\Entity\Page(); $page->setId($log->getObjectId()); $logRepo->revert($page, $log->getVersion() - 1); if ($page->getNodeIdShadowed() == $currentPage->getNodeIdShadowed()) { $pages[] = $page; } } } else { // Page exists $pages = $this->findByNodeIdShadowed($currentPage->getNodeIdShadowed()); } foreach ($pages as $page) { $pageTranslations[$page->getLang()] = \FWLanguage::getLanguageCodeById($page->getLang()); } return $pageTranslations; }
private function revertPage($pageId) { $page = new \Cx\Core\ContentManager\Model\Entity\Page(); $page->setId($pageId); $logs = $this->logRepo->getLogEntries($page); $this->logRepo->revert($page, $logs[1]->getVersion()); $page->setId(0); return array('page' => $page, 'logs' => $logs); }