/** * saveContainer * * @param ContainerEntityInterface $container * @param array $containerData * @param string $author * @param null $revisionNumber * * @return int|null */ public function saveContainer(ContainerEntityInterface $container, $containerData, $author, $revisionNumber = null) { $revision = null; $publishRevision = false; if (empty($revisionNumber)) { $revision = $container->getPublishedRevision(); $publishRevision = true; } else { $revision = $container->getRevisionById($revisionNumber); } $md5 = md5(serialize($containerData)); if (!empty($revision)) { if ($revision->getMd5() == $md5) { return null; } } $site = $container->getSite(); $newRevision = new Revision(); $newRevision->setAuthor($author); $newRevision->setMd5($md5); $isDirty = false; /** @var \Rcm\Repository\PluginWrapper $pluginWrapperRepo */ $pluginWrapperRepo = $this->_em->getRepository('\\Rcm\\Entity\\PluginWrapper'); //Make a list of original wrappers so we can see if one was removed $deletedWrapperIds = []; if ($revision) { foreach ($revision->getPluginWrappers() as $wrapper) { $deletedWrapperIds[$wrapper->getPluginWrapperId()] = true; } } if (empty($containerData)) { $isDirty = true; } else { foreach ($containerData as $pluginData) { $pluginWrapper = null; if (!empty($revision)) { /** @var \Rcm\Entity\PluginWrapper $pluginWrapper */ $pluginWrapper = $revision->getPluginWrapper($pluginData['instanceId']); if ($pluginWrapper && isset($deletedWrapperIds[$pluginWrapper->getPluginWrapperId()])) { unset($deletedWrapperIds[$pluginWrapper->getPluginWrapperId()]); } } $newPluginWrapper = $pluginWrapperRepo->savePluginWrapper($pluginData, $site, $pluginWrapper); $newRevision->addPluginWrapper($newPluginWrapper); if (!empty($pluginWrapper) && $pluginWrapper->getPluginWrapperId() == $newPluginWrapper->getPluginWrapperId() && ($pluginWrapper->getInstance()->getInstanceId() == $newPluginWrapper->getInstance()->getInstanceId() || $pluginWrapper->getInstance()->isSiteWide())) { continue; } $isDirty = true; } } if (count($deletedWrapperIds)) { $isDirty = true; } if ($isDirty) { $this->_em->persist($newRevision); $this->_em->flush($newRevision); $container->addRevision($newRevision); if ($publishRevision) { $newRevision->publishRevision(); $container->setPublishedRevision($newRevision); } $stagedRevision = $container->getStagedRevision(); if (!empty($stagedRevision) && $revision->getRevisionId() == $stagedRevision->getRevisionId()) { $container->setStagedRevision($newRevision); } $this->_em->flush($container); return $newRevision->getRevisionId(); } return null; }
/** * getContainerClone * * @param ContainerInterface $original * @param array $siteWideIdsToChange * * @return null|ContainerInterface */ protected function getContainerClone(ContainerInterface $original, $siteWideIdsToChange) { $clonedContainer = clone $original; $clonedContainer->setSite($this); $clonedContainer->setName($original->getName()); $check = $original->getPublishedRevision(); if (empty($check)) { return null; } $revision = $clonedContainer->getStagedRevision(); if (empty($revision)) { return null; } $clonedContainer->setPublishedRevision($revision); $this->fixRevisionSiteWides($revision, $siteWideIdsToChange); return $clonedContainer; }