diff --git a/vendor/magento/module-versions-cms/Observer/Backend/CmsPageSaveAfterObserver.php b/vendor/magento/module-versions-cms/Observer/Backend/CmsPageSaveAfterObserver.php index 3ae2a692db16..2872e675705f 100644 --- a/vendor/magento/module-versions-cms/Observer/Backend/CmsPageSaveAfterObserver.php +++ b/vendor/magento/module-versions-cms/Observer/Backend/CmsPageSaveAfterObserver.php @@ -174,7 +174,7 @@ private function appendPageToNodes(Page $page) } } } - if ($page->getData('assign_to_root') == 'true') { + if ($page->getData('assign_to_root') === true) { $pageNodesData = $this->jsonSerializer->unserialize($page->getNodesData()); $pageStores = array_values($page->getStores()); $sortOrder = 0; @@ -192,7 +192,7 @@ private function appendPageToNodes(Page $page) $this->createNewNode($pageData, $sortOrder, $page->getIdentifier(), null); } } - } elseif ($page->getData('assign_to_root') == 'false') { + } elseif ($page->getData('assign_to_root') === false) { $pageStores = array_values($page->getStores()); $nodeCollection = $this->nodeCollectionFactory->create(); $nodeCollection->addFieldToFilter('page_id', $page->getId()); diff --git a/vendor/magento/module-versions-cms/Observer/Backend/CmsPageSaveBeforeObserver.php b/vendor/magento/module-versions-cms/Observer/Backend/CmsPageSaveBeforeObserver.php index 594406276567..a5950b39bd69 100644 --- a/vendor/magento/module-versions-cms/Observer/Backend/CmsPageSaveBeforeObserver.php +++ b/vendor/magento/module-versions-cms/Observer/Backend/CmsPageSaveBeforeObserver.php @@ -40,13 +40,15 @@ public function execute(EventObserver $observer) { /** @var Page $page */ $page = $observer->getEvent()->getObject(); - $nodesData = $this->getNodesOrder($page->getNodesData()); - if (!$page->getId() && empty($nodesData['appendToNodes'])) { + $nodesData = $page->getNodesData(); + $nodesOrder = $this->getNodesOrder($nodesData); + if (!$page->getId() && empty($nodesOrder['appendToNodes']) && $nodesData != null) { // Newly created page should be auto assigned to website root $page->setWebsiteRoot(true); + $page->setAssignToRoot(true); } - $page->setNodesSortOrder($nodesData['sortOrder']); - $page->setAppendToNodes($nodesData['appendToNodes']); + $page->setNodesSortOrder($nodesOrder['sortOrder']); + $page->setAppendToNodes($nodesOrder['appendToNodes']); return $this; } diff --git a/vendor/magento/module-versions-cms/Plugin/Cms/Model/PageRepositoryPlugin.php b/vendor/magento/module-versions-cms/Plugin/Cms/Model/PageRepositoryPlugin.php new file mode 100644 index 000000000000..593b79893de2 --- /dev/null +++ b/vendor/magento/module-versions-cms/Plugin/Cms/Model/PageRepositoryPlugin.php @@ -0,0 +1,54 @@ +cmsHierarchy = $cmsHierarchy; + } + + /** + * Converts 'assign to root' flag to bool boolean + * + * @param PageRepository $subject + * @param PageInterface $page + * @return array + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function beforeSave( + PageRepository $subject, + PageInterface $page + ): array { + if (!$this->cmsHierarchy->isEnabled()) { + return [$page]; + } + if ($page->getAssignToRoot() !== null && $page->getAssignToRoot() !== 'false') { + $page->setAssignToRoot(json_decode($page->getAssignToRoot())); + } + + return [$page]; + } +} diff --git a/vendor/magento/module-versions-cms/etc/di.xml b/vendor/magento/module-versions-cms/etc/di.xml index 4031cec57a3e..e6f981cb1587 100644 --- a/vendor/magento/module-versions-cms/etc/di.xml +++ b/vendor/magento/module-versions-cms/etc/di.xml @@ -47,4 +47,7 @@ + + + diff --git a/vendor/magento/module-versions-cms-url-rewrite/Plugin/Cms/Model/PageRepositoryPlugin.php b/vendor/magento/module-versions-cms-url-rewrite/Plugin/Cms/Model/PageRepositoryPlugin.php index be08353234cb..ebfc80be8c06 100644 --- a/vendor/magento/module-versions-cms-url-rewrite/Plugin/Cms/Model/PageRepositoryPlugin.php +++ b/vendor/magento/module-versions-cms-url-rewrite/Plugin/Cms/Model/PageRepositoryPlugin.php @@ -7,15 +7,22 @@ namespace Magento\VersionsCmsUrlRewrite\Plugin\Cms\Model; +use Magento\Cms\Api\Data\PageInterface; +use Magento\Cms\Model\PageRepository; +use Magento\Framework\Exception\NoSuchEntityException; +use Magento\Store\Model\StoreManagerInterface; +use Magento\UrlRewrite\Model\ResourceModel\UrlRewrite as UrlRewriteResourceModel; +use Magento\UrlRewrite\Model\UrlFinderInterface; use Magento\UrlRewrite\Model\UrlPersistInterface; -use Magento\CmsUrlRewrite\Model\CmsPageUrlRewriteGenerator; +use Magento\UrlRewrite\Model\UrlRewriteFactory; use Magento\UrlRewrite\Service\V1\Data\UrlRewrite; use Magento\VersionsCms\Helper\Hierarchy; -use Magento\Cms\Api\Data\PageInterface; -use Magento\Cms\Model\PageRepository; +use Magento\VersionsCms\Model\Hierarchy\Node; +use Magento\VersionsCms\Model\Hierarchy\NodeFactory; /** * Generate and delete url rewrites for root hierarchy of the page + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class PageRepositoryPlugin { @@ -29,16 +36,56 @@ class PageRepositoryPlugin */ private $cmsHierarchy; + /** + * @var NodeFactory + */ + private $hierarchyNodeFactory; + + /** + * @var StoreManagerInterface + */ + private $storeManager; + + /** + * @var UrlFinderInterface + */ + private $urlFinder; + + /** + * @var UrlRewriteFactory + */ + private $urlRewriteFactory; + + /** + * @var UrlRewriteResourceModel + */ + private UrlRewriteResourceModel $urlRewriteResourceModel; + /** * @param UrlPersistInterface $urlPersist * @param Hierarchy $cmsHierarchy + * @param NodeFactory $hierarchyNodeFactory + * @param StoreManagerInterface $storeManager + * @param UrlFinderInterface $urlFinder + * @param UrlRewriteFactory $urlRewriteFactory + * @param UrlRewriteResourceModel $urlRewriteResourceModel */ public function __construct( UrlPersistInterface $urlPersist, - Hierarchy $cmsHierarchy + Hierarchy $cmsHierarchy, + NodeFactory $hierarchyNodeFactory, + StoreManagerInterface $storeManager, + UrlFinderInterface $urlFinder, + UrlRewriteFactory $urlRewriteFactory, + UrlRewriteResourceModel $urlRewriteResourceModel, ) { $this->urlPersist = $urlPersist; $this->cmsHierarchy = $cmsHierarchy; + $this->hierarchyNodeFactory = $hierarchyNodeFactory; + $this->storeManager = $storeManager; + $this->urlFinder = $urlFinder; + $this->urlRewriteFactory = $urlRewriteFactory; + $this->urlRewriteResourceModel = $urlRewriteResourceModel; } /** @@ -56,19 +103,21 @@ public function beforeSave( return; } if ($page->dataHasChangedFor('assign_to_root') - && $page->getData('assign_to_root') === 'true' + && $page->getData('assign_to_root') === true ) { $page->setData('rewrites_update_force', true); } } /** - * Delete url rewrites if root hierarchy is unselected for the page + * Update url rewrites if root hierarchy is unselected for the page * * @param PageRepository $subject * @param PageInterface $page * @return PageInterface * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * @throws NoSuchEntityException + * @throws \Exception */ public function afterSave( PageRepository $subject, @@ -78,14 +127,53 @@ public function afterSave( return $page; } if ($page->hasData('website_root') && !$page->getData('website_root')) { - $this->urlPersist->deleteByData( + $nodeUrl = null; + $node = $this->hierarchyNodeFactory->create( [ - UrlRewrite::ENTITY_ID => $page->getId(), - UrlRewrite::REQUEST_PATH => $page->getIdentifier(), - UrlRewrite::ENTITY_TYPE => CmsPageUrlRewriteGenerator::ENTITY_TYPE, + 'data' => [ + 'scope' => Node::NODE_SCOPE_STORE, + 'scope_id' => $this->storeManager->getStore()->getId(), + ], ] - ); + )->getHeritage(); + $requestUrl = $page->getIdentifier(); + if ($node->checkIdentifier($requestUrl, $this->storeManager->getStore())) { + if (!$node->getId()) { + $collection = $node->getNodesCollection(); + foreach ($collection as $item) { + if ($item->getPageIdentifier() == $requestUrl) { + $nodeUrl = $item->getRequestUrl(); + break; + } + } + } + } + $this->setNodeTargetPathUrlRewrite($nodeUrl, [UrlRewrite::REQUEST_PATH => $requestUrl]); } return $page; } + + /** + * Update url rewrites with 301 redirect and node target path + * + * @param string|null $nodeUrl + * @param array $filterData + * @return void + * @throws \Exception + */ + private function setNodeTargetPathUrlRewrite(?string $nodeUrl, array $filterData): void + { + if (!empty($nodeUrl) && !empty($filterData)) { + $findRewrite = $this->urlFinder->findOneByData($filterData); + if (!empty($findRewrite) && $findRewrite->getTargetPath()!==$nodeUrl) { + $urlRewrite = $this->urlRewriteFactory->create(); + $this->urlRewriteResourceModel->load($urlRewrite, $findRewrite->getUrlRewriteId()); + if ($urlRewrite->getId()) { + $urlRewrite->setTargetPath($nodeUrl); + $urlRewrite->setRedirectType(301); + $urlRewrite->save(); + } + } + } + } }