Skip to content

Commit 99c8f54

Browse files
committed
Merge remote-tracking branch 'origin/MC-33028' into 2.4-develop-pr27
2 parents 619d155 + 57102d4 commit 99c8f54

File tree

3 files changed

+111
-22
lines changed

3 files changed

+111
-22
lines changed

app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Store/View.php

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
*
2020
* @see \Magento\Store\Model\ResourceModel\Store
2121
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
22-
* @package Magento\CatalogUrlRewrite\Model\Category\Plugin\Store
2322
*/
2423
class View
2524
{
@@ -39,7 +38,7 @@ class View
3938
protected $productFactory;
4039

4140
/**
42-
* @var \Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator
41+
* @var CategoryUrlRewriteGenerator
4342
*/
4443
protected $categoryUrlRewriteGenerator;
4544

@@ -75,6 +74,8 @@ public function __construct(
7574
}
7675

7776
/**
77+
* Setter for Orig Store data
78+
*
7879
* @param \Magento\Store\Model\ResourceModel\Store $object
7980
* @param AbstractModel $store
8081
* @return void
@@ -100,14 +101,13 @@ public function afterSave(
100101
\Magento\Store\Model\ResourceModel\Store $store
101102
) {
102103
if ($this->origStore->isObjectNew() || $this->origStore->dataHasChangedFor('group_id')) {
103-
if (!$this->origStore->isObjectNew()) {
104-
$this->urlPersist->deleteByData([UrlRewrite::STORE_ID => $this->origStore->getId()]);
105-
}
106-
107-
$this->urlPersist->replace(
108-
$this->generateCategoryUrls($this->origStore->getRootCategoryId(), $this->origStore->getId())
104+
$categoryRewriteUrls = $this->generateCategoryUrls(
105+
$this->origStore->getRootCategoryId(),
106+
$this->origStore->getId()
109107
);
110108

109+
$this->urlPersist->replace($categoryRewriteUrls);
110+
111111
$this->urlPersist->replace(
112112
$this->generateProductUrls(
113113
$this->origStore->getWebsiteId(),
@@ -139,33 +139,34 @@ protected function generateProductUrls($websiteId, $originWebsiteId, $storeId)
139139
->addAttributeToSelect(['name', 'url_path', 'url_key', 'visibility'])
140140
->addWebsiteFilter($websiteIds);
141141
foreach ($collection as $product) {
142-
$product->setStoreId($storeId);
143142
/** @var \Magento\Catalog\Model\Product $product */
144-
$urls = array_merge(
145-
$urls,
146-
$this->productUrlRewriteGenerator->generate($product)
147-
);
143+
$product->setStoreId($storeId);
144+
$urls[] = $this->productUrlRewriteGenerator->generate($product);
148145
}
146+
$urls = array_merge([], ...$urls);
147+
149148
return $urls;
150149
}
151150

152151
/**
152+
* Generate url rewrites for categories
153+
*
153154
* @param int $rootCategoryId
154155
* @param int $storeId
155156
* @return array
156157
*/
157158
protected function generateCategoryUrls($rootCategoryId, $storeId)
158159
{
159160
$urls = [];
160-
$categories = $this->categoryFactory->create()->getCategories($rootCategoryId, 1, false, true);
161+
$categories = $this->categoryFactory->create()->getCategories($rootCategoryId, 1, false, true, false);
162+
$categories->setStoreId($storeId);
161163
foreach ($categories as $category) {
162-
/** @var \Magento\Catalog\Model\Category $category */
164+
/** @var Category $category */
163165
$category->setStoreId($storeId);
164-
$urls = array_merge(
165-
$urls,
166-
$this->categoryUrlRewriteGenerator->generate($category)
167-
);
166+
$urls[] = $this->categoryUrlRewriteGenerator->generate($category);
168167
}
168+
$urls = array_merge([], ...$urls);
169+
169170
return $urls;
170171
}
171172

app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/Plugin/Store/ViewTest.php

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
namespace Magento\CatalogUrlRewrite\Test\Unit\Model\Category\Plugin\Store;
99

10+
use Magento\Catalog\Model\ResourceModel\Category\Collection as CategoryCollection;
1011
use Magento\Catalog\Model\Category;
1112
use Magento\Catalog\Model\CategoryFactory;
1213
use Magento\Catalog\Model\Product;
@@ -87,6 +88,9 @@ class ViewTest extends TestCase
8788
*/
8889
private $productMock;
8990

91+
/**
92+
* @inheritdoc
93+
*/
9094
protected function setUp(): void
9195
{
9296
$this->objectManager = new ObjectManager($this);
@@ -139,7 +143,12 @@ protected function setUp(): void
139143
);
140144
}
141145

142-
public function testAfterSave()
146+
/**
147+
* Test after save
148+
*
149+
* @return void
150+
*/
151+
public function testAfterSave(): void
143152
{
144153
$origStoreMock = $this->getMockBuilder(\Magento\Store\Model\Store::class)
145154
->disableOriginalConstructor()
@@ -155,9 +164,16 @@ public function testAfterSave()
155164
$this->abstractModelMock->expects($this->any())
156165
->method('isObjectNew')
157166
->willReturn(true);
167+
$categoryCollection = $this->getMockBuilder(CategoryCollection::class)
168+
->disableOriginalConstructor()
169+
->setMethods(['getIterator'])
170+
->getMock();
171+
$categoryCollection->expects($this->any())
172+
->method('getIterator')
173+
->willReturn(new \ArrayIterator([]));
158174
$this->categoryMock->expects($this->once())
159175
->method('getCategories')
160-
->willReturn([]);
176+
->willReturn($categoryCollection);
161177
$this->categoryFactoryMock->expects($this->once())
162178
->method('create')
163179
->willReturn($this->categoryMock);
@@ -191,7 +207,12 @@ public function testAfterSave()
191207
);
192208
}
193209

194-
public function testAfterDelete()
210+
/**
211+
* Test after delete
212+
*
213+
* @return void
214+
*/
215+
public function testAfterDelete(): void
195216
{
196217
$this->urlPersistMock->expects($this->once())
197218
->method('deleteByData');

dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteTest.php

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Magento\CatalogUrlRewrite\Model\Map\DataCategoryUrlRewriteDatabaseMap;
1616
use Magento\CatalogUrlRewrite\Model\Map\DataProductUrlRewriteDatabaseMap;
1717
use Magento\CatalogUrlRewrite\Model\ResourceModel\Category\Product;
18+
use Magento\Store\Api\WebsiteRepositoryInterface;
1819
use Magento\Store\Model\ScopeInterface;
1920
use Magento\UrlRewrite\Model\Exception\UrlAlreadyExistsException;
2021
use Magento\UrlRewrite\Model\OptionProvider;
@@ -63,6 +64,8 @@ protected function setUp(): void
6364
}
6465

6566
/**
67+
* Test url rewrite after category save
68+
*
6669
* @magentoDataFixture Magento/Catalog/_files/category_with_position.php
6770
* @dataProvider categoryProvider
6871
* @param array $data
@@ -80,6 +83,8 @@ public function testUrlRewriteOnCategorySave(array $data): void
8083
}
8184

8285
/**
86+
* Provider. categoryProvider
87+
*
8388
* @return array
8489
*/
8590
public function categoryProvider(): array
@@ -123,6 +128,8 @@ public function categoryProvider(): array
123128
}
124129

125130
/**
131+
* Test category product url rewrite
132+
*
126133
* @magentoDataFixture Magento/Catalog/_files/category_tree.php
127134
* @magentoDataFixture Magento/Catalog/_files/second_product_simple.php
128135
* @dataProvider productRewriteProvider
@@ -140,6 +147,8 @@ public function testCategoryProductUrlRewrite(array $data): void
140147
}
141148

142149
/**
150+
* Provider. productRewriteProvider
151+
*
143152
* @return array
144153
*/
145154
public function productRewriteProvider(): array
@@ -165,6 +174,8 @@ public function productRewriteProvider(): array
165174
}
166175

167176
/**
177+
* Test url rewrites after category save with existing url key
178+
*
168179
* @magentoDataFixture Magento/CatalogUrlRewrite/_files/categories_with_products.php
169180
* @magentoAppIsolation enabled
170181
* @dataProvider existingUrlProvider
@@ -179,6 +190,8 @@ public function testUrlRewriteOnCategorySaveWithExistingUrlKey(array $data): voi
179190
}
180191

181192
/**
193+
* Provider. existingUrlProvider
194+
*
182195
* @return array
183196
*/
184197
public function existingUrlProvider(): array
@@ -226,6 +239,8 @@ public function existingUrlProvider(): array
226239
}
227240

228241
/**
242+
* Test url rewrites after category move
243+
*
229244
* @magentoDataFixture Magento/Catalog/_files/category_product.php
230245
* @magentoDataFixture Magento/Catalog/_files/catalog_category_with_slash.php
231246
* @dataProvider categoryMoveProvider
@@ -287,6 +302,7 @@ public function categoryMoveProvider(): array
287302
}
288303

289304
/**
305+
* Test url rewrites after category delete
290306
* @magentoDataFixture Magento/Catalog/_files/category.php
291307
* @return void
292308
*/
@@ -302,6 +318,8 @@ public function testUrlRewritesAfterCategoryDelete(): void
302318
}
303319

304320
/**
321+
* Test url rewrites after category with products delete
322+
*
305323
* @magentoAppArea adminhtml
306324
* @magentoDataFixture Magento/CatalogUrlRewrite/_files/categories_with_product_ids.php
307325
* @return void
@@ -325,6 +343,8 @@ public function testUrlRewritesAfterCategoryWithProductsDelete(): void
325343
}
326344

327345
/**
346+
* Test category url rewrite per Store Views
347+
*
328348
* @magentoDataFixture Magento/Store/_files/second_store.php
329349
* @magentoDataFixture Magento/Catalog/_files/category.php
330350
* @return void
@@ -353,6 +373,53 @@ public function testCategoryUrlRewritePerStoreViews(): void
353373
}
354374
}
355375

376+
/**
377+
* Test category url rewrite while reassign store view
378+
*
379+
* @magentoAppArea adminhtml
380+
* @magentoDataFixture Magento/Store/_files/second_store_group_with_second_website.php
381+
* @magentoDataFixture Magento/Catalog/_files/category.php
382+
* @return void
383+
*/
384+
public function testCategoryUrlRewriteMovingToOtherStoreView(): void
385+
{
386+
$categoryId = 333;
387+
$store = $this->storeRepository->get('default');
388+
$storeId = $store->getId();
389+
$urlRewrites = [
390+
['category-1-updated.html', 'category-1.html'],
391+
['category-1-most-recent.html', 'category-1-updated.html'],
392+
];
393+
foreach ($urlRewrites as $rewrite) {
394+
/** @var \Magento\UrlRewrite\Model\UrlRewrite $urlRewrite */
395+
$urlRewrite = $this->objectManager->create(\Magento\UrlRewrite\Model\UrlRewrite::class);
396+
$urlRewrite->setEntityType(\Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator::ENTITY_TYPE)
397+
->setEntityId($categoryId)
398+
->setRequestPath($rewrite[0])
399+
->setTargetPath($rewrite[1])
400+
->setRedirectType(\Magento\UrlRewrite\Model\OptionProvider::PERMANENT)
401+
->setStoreId($storeId);
402+
$urlRewrite->save();
403+
}
404+
405+
/** @var WebsiteRepositoryInterface $websiteRepo */
406+
$websiteRepo = $this->objectManager->get(WebsiteRepositoryInterface::class);
407+
$website = $websiteRepo->get('test');
408+
$group = $website->getDefaultGroup();
409+
$group->setRootCategoryId(2);
410+
$group->save();
411+
$groupId = $group->getId();
412+
$store->setStoreGroupId($groupId);
413+
$store->save();
414+
415+
$urlRewriteItems = $this->getEntityRewriteCollection($categoryId)->getItems();
416+
$this->assertTrue(count($urlRewriteItems) === 3);
417+
$expectedRewriteRequestPaths = ['category-1.html', 'category-1-updated.html', 'category-1-most-recent.html'];
418+
foreach ($urlRewriteItems as $item) {
419+
$this->assertTrue(in_array($item->getRequestPath(), $expectedRewriteRequestPaths));
420+
}
421+
}
422+
356423
/**
357424
* @inheritdoc
358425
*/

0 commit comments

Comments
 (0)