Skip to content

Commit 3696290

Browse files
committed
Merge remote-tracking branch 'origin/MC-18561' into 2.3-develop-pr30
2 parents 17a9daa + e0a82d0 commit 3696290

File tree

3 files changed

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

3 files changed

+222
-0
lines changed
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\CmsUrlRewrite\Plugin\Cms\Model\Store;
9+
10+
use Magento\Cms\Api\PageRepositoryInterface;
11+
use Magento\CmsUrlRewrite\Model\CmsPageUrlRewriteGenerator;
12+
use Magento\Framework\Api\SearchCriteriaBuilder;
13+
use Magento\Framework\Model\AbstractModel;
14+
use Magento\Store\Model\ResourceModel\Store as ResourceStore;
15+
use Magento\UrlRewrite\Model\UrlPersistInterface;
16+
17+
/**
18+
* Plugin which is listening store resource model and on save replace cms page url rewrites
19+
*
20+
* @see ResourceStore
21+
*/
22+
class View
23+
{
24+
/**
25+
* @var UrlPersistInterface
26+
*/
27+
private $urlPersist;
28+
29+
/**
30+
* @var CmsPageUrlRewriteGenerator
31+
*/
32+
private $cmsPageUrlRewriteGenerator;
33+
34+
/**
35+
* @var PageRepositoryInterface
36+
*/
37+
private $pageRepository;
38+
39+
/**
40+
* @var SearchCriteriaBuilder
41+
*/
42+
private $searchCriteriaBuilder;
43+
44+
/**
45+
* Update store view plugin constructor
46+
*
47+
* @param UrlPersistInterface $urlPersist
48+
* @param SearchCriteriaBuilder $searchCriteriaBuilder
49+
* @param PageRepositoryInterface $pageRepository
50+
* @param CmsPageUrlRewriteGenerator $cmsPageUrlRewriteGenerator
51+
*/
52+
public function __construct(
53+
UrlPersistInterface $urlPersist,
54+
SearchCriteriaBuilder $searchCriteriaBuilder,
55+
PageRepositoryInterface $pageRepository,
56+
CmsPageUrlRewriteGenerator $cmsPageUrlRewriteGenerator
57+
) {
58+
$this->urlPersist = $urlPersist;
59+
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
60+
$this->pageRepository = $pageRepository;
61+
$this->cmsPageUrlRewriteGenerator = $cmsPageUrlRewriteGenerator;
62+
}
63+
64+
/**
65+
* Replace cms page url rewrites on store view save
66+
*
67+
* @param ResourceStore $object
68+
* @param ResourceStore $result
69+
* @param ResourceStore $store
70+
* @return void
71+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
72+
*/
73+
public function afterSave(ResourceStore $object, ResourceStore $result, AbstractModel $store): void
74+
{
75+
if ($store->isObjectNew() || $store->dataHasChangedFor('group_id')) {
76+
$this->urlPersist->replace(
77+
$this->generateCmsPagesUrls((int)$store->getId())
78+
);
79+
}
80+
}
81+
82+
/**
83+
* Generate url rewrites for cms pages to store view
84+
*
85+
* @param int $storeId
86+
* @return array
87+
*/
88+
private function generateCmsPagesUrls(int $storeId): array
89+
{
90+
$rewrites = [];
91+
$urls = [];
92+
$searchCriteria = $this->searchCriteriaBuilder->create();
93+
$cmsPagesCollection = $this->pageRepository->getList($searchCriteria)->getItems();
94+
foreach ($cmsPagesCollection as $page) {
95+
$page->setStoreId($storeId);
96+
$rewrites[] = $this->cmsPageUrlRewriteGenerator->generate($page);
97+
}
98+
$urls = array_merge($urls, ...$rewrites);
99+
100+
return $urls;
101+
}
102+
}
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="update_cms_url_rewrites_after_store_save" type="Magento\CmsUrlRewrite\Plugin\Cms\Model\Store\View"/>
11+
</type>
12+
</config>
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\CmsUrlRewrite\Plugin\Cms\Model\Store;
9+
10+
use Magento\Framework\ObjectManagerInterface;
11+
use Magento\Store\Model\Store;
12+
use Magento\Store\Model\StoreFactory;
13+
use Magento\TestFramework\Helper\Bootstrap;
14+
use Magento\UrlRewrite\Model\UrlFinderInterface;
15+
use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
16+
17+
/**
18+
* Test for plugin which is listening store resource model and on save replace cms page url rewrites
19+
*
20+
* @magentoAppArea adminhtml
21+
*/
22+
class ViewTest extends \PHPUnit\Framework\TestCase
23+
{
24+
/**
25+
* @var UrlFinderInterface
26+
*/
27+
private $urlFinder;
28+
29+
/**
30+
* @var ObjectManagerInterface
31+
*/
32+
private $objectManager;
33+
34+
/**
35+
* @var Store
36+
*/
37+
private $storeFactory;
38+
39+
/**
40+
* @inheritdoc
41+
*/
42+
protected function setUp()
43+
{
44+
$this->objectManager = Bootstrap::getObjectManager();
45+
$this->urlFinder = $this->objectManager->create(UrlFinderInterface::class);
46+
$this->storeFactory = $this->objectManager->create(StoreFactory::class);
47+
}
48+
49+
/**
50+
* Test of replacing cms page url rewrites on create and delete store
51+
*
52+
* @magentoDataFixture Magento/Cms/_files/pages.php
53+
*/
54+
public function testUrlRewritesChangesAfterStoreSave()
55+
{
56+
$storeId = $this->createStore();
57+
$this->assertUrlRewritesCount($storeId, 1);
58+
$this->deleteStore($storeId);
59+
$this->assertUrlRewritesCount($storeId, 0);
60+
}
61+
62+
/**
63+
* Assert url rewrites count by store id
64+
*
65+
* @param int $storeId
66+
* @param int $expectedCount
67+
*/
68+
private function assertUrlRewritesCount(int $storeId, int $expectedCount): void
69+
{
70+
$data = [
71+
UrlRewrite::REQUEST_PATH => 'page100',
72+
UrlRewrite::STORE_ID => $storeId
73+
];
74+
$urlRewrites = $this->urlFinder->findAllByData($data);
75+
$this->assertCount($expectedCount, $urlRewrites);
76+
}
77+
78+
/**
79+
* Create test store
80+
*
81+
* @return int
82+
*/
83+
private function createStore(): int
84+
{
85+
$store = $this->storeFactory->create();
86+
$store->setCode('test_' . random_int(0, 999))
87+
->setName('Test Store')
88+
->unsId()
89+
->save();
90+
91+
return (int)$store->getId();
92+
}
93+
94+
/**
95+
* Delete test store
96+
*
97+
* @param int $storeId
98+
* @return void
99+
*/
100+
private function deleteStore(int $storeId): void
101+
{
102+
$store = $this->storeFactory->create();
103+
$store->load($storeId);
104+
if ($store !== null) {
105+
$store->delete();
106+
}
107+
}
108+
}

0 commit comments

Comments
 (0)