/** * @param Content|null $originalResource * @return Content */ public function duplicate($originalResource) { if (!$originalResource) { return null; } /** @var Content $newResource */ $newResource = $this->createNew(); $newResource->setTitle($originalResource->getTitle()); $newResource->setSlug($originalResource->getSlug()); $newResource->setMetaDescription($originalResource->getMetaDescription()); $newResource->setPageTitle($originalResource->getPageTitle()); $newResource->setPriority($originalResource->getPriority()); $newResource->setChangeFrequency($originalResource->getChangeFrequency()); $newResource->setPublic($originalResource->isPublic()); $newResource->setPublicationDate($originalResource->getPublicationDate()); $newResource->setPublishedUntil($originalResource->getPublishedUntil()); $newResource->setCreated(new \DateTime()); $newResource->setUpdated(new \DateTime()); return $newResource; }
/** * Returns the previous published content in order if sorted by publication date. * Only returns contents that are published and whose publication date does not lie in the future. * The order used is the same as in findPublished(). * * @param Content $currentContent The current content * @param \DateTime $currentDate The date used to determine if a publication date lies in the future. If null or omitted, today is used. * @return null|Content The previous content before $currentContent, or null if $currentContent is the first one. */ public function findPreviousInDateOrder(Content $currentContent, \DateTime $currentDate = null) { if (null === $currentDate) { $currentDate = new \DateTime(); } // Find contents with same date $query = $this->createQueryBuilder('n'); $query->andWhere('n.public = true'); $query->andWhere('n.publicationDate <= :currentDate'); $query->andWhere('n.publicationDate = :contentDate'); $query->andWhere('n.hideAt >= :currentDate'); $query->orWhere('n.hideAt IS NULL'); $query->setParameter('currentDate', $currentDate); $query->setParameter('contentDate', $currentContent->getPublicationDate()); $contentsSameDate = $query->getQuery()->getResult(); if (!empty($contentsSameDate) && !($contentsSameDate[count($contentsSameDate) - 1]->getId() == $currentContent->getId())) { // Return next in list for ($i = 0; $i < count($contentsSameDate); $i++) { if ($contentsSameDate[$i]->getId() == $currentContent->getId()) { return $contentsSameDate[$i + 1]; } } } // No next one at current date, search for newer ones $query = $this->createQueryBuilder('n'); $query->andWhere('n.public = true'); $query->andWhere('n.publicationDate <= :currentDate'); $query->andWhere('n.publicationDate < :contentDate'); $query->andWhere('n.hideAt >= :currentDate'); $query->orWhere('n.hideAt IS NULL'); $query->setParameter('currentDate', $currentDate); $query->setParameter('contentDate', $currentContent->getPublicationDate()); $query->addOrderBy('n.publicationDate', 'desc'); $query->addOrderBy('n.id', 'asc'); $query->setMaxResults(1); $nextContent = $query->getQuery()->getResult(); if (empty($nextContent)) { // No older contents return null; } else { return $nextContent[0]; } }