Skip to content

Commit b287f41

Browse files
MC-18561: After changing store view the cms page is not redirecting correctly
1 parent 308162e commit b287f41

File tree

4 files changed

+124
-52
lines changed
  • app/code/Magento/CmsUrlRewrite
  • dev/tests/integration/testsuite/Magento/CmsUrlRewrite/Plugin/Cms/Model/Store

4 files changed

+124
-52
lines changed

app/code/Magento/CmsUrlRewrite/Plugin/Cms/Model/Store/View.php

Lines changed: 21 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,24 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
67

78
namespace Magento\CmsUrlRewrite\Plugin\Cms\Model\Store;
89

910
use Magento\Cms\Api\PageRepositoryInterface;
1011
use Magento\CmsUrlRewrite\Model\CmsPageUrlRewriteGenerator;
1112
use Magento\Framework\Api\SearchCriteriaBuilder;
12-
use Magento\Framework\Model\AbstractModel;
13-
use Magento\Store\Model\ResourceModel\Store;
13+
use Magento\Store\Model\Store;
14+
use Magento\Store\Model\ResourceModel\Store as ResourceStore;
1415
use Magento\UrlRewrite\Model\UrlPersistInterface;
15-
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
1616

1717
/**
1818
* Plugin which is listening store resource model and on save replace cms page url rewrites
1919
*
20-
* @see Store
20+
* @see ResourceStore
2121
*/
2222
class View
2323
{
24-
/**
25-
* @var AbstractModel
26-
*/
27-
private $origStore;
28-
2924
/**
3025
* @var UrlPersistInterface
3126
*/
@@ -65,38 +60,23 @@ public function __construct(
6560
}
6661

6762
/**
68-
* Get the correct store for later regenerate url
69-
*
70-
* @param Store $object
71-
* @param AbstractModel $store
72-
* @return void
73-
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
74-
*/
75-
public function beforeSave(
76-
Store $object,
77-
AbstractModel $store
78-
) {
79-
$this->origStore = $store;
80-
}
81-
82-
/**
83-
* Regenerate urls on store after save
84-
*
63+
* @param ResourceStore $object
64+
* @param \Closure $proceed
8565
* @param Store $store
86-
* @return Store
66+
* @return mixed
67+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
8768
*/
88-
public function afterSave(
89-
Store $store
90-
) {
91-
if ($this->origStore->isObjectNew() || $this->origStore->dataHasChangedFor('group_id')) {
92-
if (!$this->origStore->isObjectNew()) {
93-
$this->urlPersist->deleteByData([UrlRewrite::STORE_ID => $this->origStore->getId()]);
94-
}
69+
public function aroundSave(ResourceStore $object, \Closure $proceed, Store $store)
70+
{
71+
$newStore = $store->isObjectNew() || $store->dataHasChangedFor('group_id');
72+
$result = $proceed($store);
73+
if ($newStore) {
9574
$this->urlPersist->replace(
96-
$this->generateCmsPagesUrls($this->origStore->getId())
75+
$this->generateCmsPagesUrls((int)$store->getId())
9776
);
9877
}
99-
return $store;
78+
79+
return $result;
10080
}
10181

10282
/**
@@ -105,20 +85,18 @@ public function afterSave(
10585
* @param int $storeId
10686
* @return array
10787
*/
108-
private function generateCmsPagesUrls($storeId): array
88+
private function generateCmsPagesUrls(int $storeId): array
10989
{
90+
$rewrites = [];
11091
$urls = [];
11192
$searchCriteria = $this->searchCriteriaBuilder->create();
11293
$cmsPagesCollection = $this->pageRepository->getList($searchCriteria)->getItems();
11394
foreach ($cmsPagesCollection as $page) {
11495
$page->setStoreId($storeId);
115-
/** @var \Magento\Cms\Model\Page $page */
116-
// phpcs:ignore Magento2.Performance.ForeachArrayMerge
117-
$urls = array_merge(
118-
$urls,
119-
$this->cmsPageUrlRewriteGenerator->generate($page)
120-
);
96+
$rewrites[] = $this->cmsPageUrlRewriteGenerator->generate($page);
12197
}
98+
$urls = array_merge($urls, ...$rewrites);
99+
122100
return $urls;
123101
}
124102
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
9+
<type name="Magento\Store\Model\ResourceModel\Store">
10+
<plugin name="cms_url_rewrite_after_store_save" type="Magento\CmsUrlRewrite\Plugin\Cms\Model\Store\View"/>
11+
</type>
12+
</config>

app/code/Magento/CmsUrlRewrite/etc/di.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,4 @@
99
<type name="Magento\Cms\Model\ResourceModel\Page">
1010
<plugin name="cms_url_rewrite_plugin" type="Magento\CmsUrlRewrite\Plugin\Cms\Model\ResourceModel\Page"/>
1111
</type>
12-
<type name="Magento\Store\Model\ResourceModel\Store">
13-
<plugin name="cms_url_rewrite_after_store_save" type="Magento\CmsUrlRewrite\Plugin\Cms\Model\Store\View"/>
14-
</type>
1512
</config>

dev/tests/integration/testsuite/Magento/CmsUrlRewrite/Plugin/Cms/Model/Store/ViewTest.php

Lines changed: 91 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
declare(strict_types=1);
67

78
namespace Magento\CmsUrlRewrite\Plugin\Cms\Model\Store;
89

9-
use Magento\Store\Model\StoreFactory;
10+
use Magento\Framework\ObjectManagerInterface;
11+
use Magento\Framework\Registry;
12+
use Magento\Store\Model\Store;
1013
use Magento\TestFramework\Helper\Bootstrap;
1114
use Magento\UrlRewrite\Model\UrlFinderInterface;
1215
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
@@ -22,22 +25,23 @@ class ViewTest extends \PHPUnit\Framework\TestCase
2225
private $urlFinder;
2326

2427
/**
25-
* @var StoreFactory
28+
* @var ObjectManagerInterface
2629
*/
27-
private $storeFactory;
30+
private $objectManager;
2831

2932
/**
3033
* @inheritdoc
3134
*/
3235
protected function setUp()
3336
{
34-
$this->storeFactory = Bootstrap::getObjectManager()->create(StoreFactory::class);
35-
$this->urlFinder = Bootstrap::getObjectManager()->create(UrlFinderInterface::class);
37+
$this->objectManager = Bootstrap::getObjectManager();
38+
$this->urlFinder = $this->objectManager->create(UrlFinderInterface::class);
3639
}
3740

3841
/**
42+
* Test of replacing cms page url rewrites on create and delete store
43+
*
3944
* @magentoDataFixture Magento/Cms/_files/pages.php
40-
* @magentoDataFixture Magento/Store/_files/store.php
4145
* @magentoAppArea adminhtml
4246
*/
4347
public function testAfterSave()
@@ -46,6 +50,87 @@ public function testAfterSave()
4650
UrlRewrite::REQUEST_PATH => 'page100',
4751
];
4852
$urlRewrites = $this->urlFinder->findAllByData($data);
53+
$this->assertCount(1, $urlRewrites);
54+
$this->createStore();
55+
$urlRewrites = $this->urlFinder->findAllByData($data);
4956
$this->assertCount(2, $urlRewrites);
57+
$this->deleteStore();
58+
$urlRewrites = $this->urlFinder->findAllByData($data);
59+
$this->assertCount(1, $urlRewrites);
60+
}
61+
62+
/**
63+
* Create test store
64+
*
65+
* @return void
66+
*/
67+
private function createStore(): void
68+
{
69+
/** @var $store Store */
70+
$store = $this->objectManager->create(Store::class);
71+
if (!$store->load('test', 'code')->getId()) {
72+
$store->setData(
73+
[
74+
'code' => 'test',
75+
'website_id' => '1',
76+
'group_id' => '1',
77+
'name' => 'Test Store',
78+
'sort_order' => '0',
79+
'is_active' => '1',
80+
]
81+
);
82+
$store->save();
83+
} else {
84+
if ($store->getId()) {
85+
/** @var \Magento\TestFramework\Helper\Bootstrap $registry */
86+
$registry = Bootstrap::getObjectManager()->get(
87+
Registry::class
88+
);
89+
$registry->unregister('isSecureArea');
90+
$registry->register('isSecureArea', true);
91+
$store->delete();
92+
$registry->unregister('isSecureArea');
93+
$registry->register('isSecureArea', false);
94+
$store = $this->objectManager->create(Store::class);
95+
$store->setData(
96+
[
97+
'code' => 'test',
98+
'website_id' => '1',
99+
'group_id' => '1',
100+
'name' => 'Test Store',
101+
'sort_order' => '0',
102+
'is_active' => '1',
103+
]
104+
);
105+
$store->save();
106+
}
107+
}
108+
}
109+
110+
/**
111+
* Delete test store
112+
*
113+
* @return void
114+
*/
115+
private function deleteStore(): void
116+
{
117+
/** @var Registry $registry */
118+
$registry = $this->objectManager->get(Registry::class);
119+
$registry->unregister('isSecureArea');
120+
$registry->register('isSecureArea', true);
121+
/** @var Store $store */
122+
$store = $this->objectManager->get(Store::class);
123+
$store->load('test', 'code');
124+
if ($store->getId()) {
125+
$store->delete();
126+
}
127+
/** @var Store $store */
128+
$store = $this->objectManager->get(Store::class);
129+
$store->load('test', 'code');
130+
if ($store->getId()) {
131+
$store->delete();
132+
}
133+
$registry->unregister('isSecureArea');
134+
$registry->register('isSecureArea', false);
50135
}
51136
}

0 commit comments

Comments
 (0)