Skip to content

Commit 711885d

Browse files
Merge remote-tracking branch 'origin/2.2-develop' into Okapis-PR
2 parents 76f6ca5 + 14e7a37 commit 711885d

File tree

7 files changed

+200
-21
lines changed

7 files changed

+200
-21
lines changed

app/code/Magento/CatalogUrlRewrite/Model/CategoryBasedProductRewriteGenerator.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
use Magento\Catalog\Model\Category;
99
use Magento\Catalog\Model\Product;
10-
use Magento\Store\Model\Store;
1110
use Magento\Catalog\Model\Product\Visibility;
1211

1312
/**
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\CatalogUrlRewrite\Model;
7+
8+
use Magento\Catalog\Model\Product;
9+
use Magento\Catalog\Model\Product\Visibility;
10+
11+
/**
12+
* Class ProductUrlRewriteGenerator
13+
* @package Magento\CatalogUrlRewrite\Model
14+
*/
15+
class CategoryProductUrlPathGenerator
16+
{
17+
/**
18+
* @var ProductScopeRewriteGenerator
19+
*/
20+
private $productScopeRewriteGenerator;
21+
22+
/**
23+
* @param ProductScopeRewriteGenerator $productScopeRewriteGenerator
24+
*/
25+
public function __construct(
26+
ProductScopeRewriteGenerator $productScopeRewriteGenerator
27+
) {
28+
$this->productScopeRewriteGenerator = $productScopeRewriteGenerator;
29+
}
30+
31+
/**
32+
* Generate product url rewrites based on all product categories
33+
*
34+
* @param \Magento\Catalog\Model\Product $product
35+
* @param int|null $rootCategoryId
36+
* @return \Magento\UrlRewrite\Service\V1\Data\UrlRewrite[]
37+
*/
38+
public function generate(Product $product, $rootCategoryId = null)
39+
{
40+
if ($product->getVisibility() == Visibility::VISIBILITY_NOT_VISIBLE) {
41+
return [];
42+
}
43+
44+
$storeId = $product->getStoreId();
45+
46+
$productCategories = $product->getCategoryCollection()
47+
->addAttributeToSelect('url_key')
48+
->addAttributeToSelect('url_path');
49+
50+
$urls = $this->productScopeRewriteGenerator->isGlobalScope($storeId)
51+
? $this->productScopeRewriteGenerator->generateForGlobalScope(
52+
$productCategories,
53+
$product,
54+
$rootCategoryId
55+
)
56+
: $this->productScopeRewriteGenerator->generateForSpecificStoreView(
57+
$storeId,
58+
$productCategories,
59+
$product,
60+
$rootCategoryId
61+
);
62+
63+
return $urls;
64+
}
65+
}

app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class UrlRewriteHandler
2525
/** @var \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory */
2626
protected $productCollectionFactory;
2727

28-
/** @var \Magento\CatalogUrlRewrite\Model\CategoryBasedProductRewriteGenerator */
28+
/** @var \Magento\CatalogUrlRewrite\Model\CategoryProductUrlPathGenerator */
2929
private $categoryBasedProductRewriteGenerator;
3030

3131
/** @var \Magento\UrlRewrite\Model\MergeDataProvider */
@@ -40,6 +40,7 @@ class UrlRewriteHandler
4040
* @param \Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator $productUrlRewriteGenerator
4141
* @param \Magento\UrlRewrite\Model\UrlPersistInterface $urlPersist
4242
* @param \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory
43+
* @param \Magento\CatalogUrlRewrite\Model\CategoryProductUrlPathGenerator $categoryBasedProductRewriteGenerator
4344
* @param \Magento\UrlRewrite\Model\MergeDataProviderFactory|null $mergeDataProviderFactory
4445
* @param \Magento\Framework\Serialize\Serializer\Json|null $serializer
4546
*/
@@ -49,6 +50,7 @@ public function __construct(
4950
\Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator $productUrlRewriteGenerator,
5051
\Magento\UrlRewrite\Model\UrlPersistInterface $urlPersist,
5152
\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
53+
\Magento\CatalogUrlRewrite\Model\CategoryProductUrlPathGenerator $categoryBasedProductRewriteGenerator,
5254
\Magento\UrlRewrite\Model\MergeDataProviderFactory $mergeDataProviderFactory = null,
5355
\Magento\Framework\Serialize\Serializer\Json $serializer = null
5456
) {
@@ -57,6 +59,7 @@ public function __construct(
5759
$this->productUrlRewriteGenerator = $productUrlRewriteGenerator;
5860
$this->urlPersist = $urlPersist;
5961
$this->productCollectionFactory = $productCollectionFactory;
62+
$this->categoryBasedProductRewriteGenerator = $categoryBasedProductRewriteGenerator;
6063

6164
if (!isset($mergeDataProviderFactory)) {
6265
$mergeDataProviderFactory = \Magento\Framework\App\ObjectManager::getInstance()->get(
@@ -130,7 +133,7 @@ public function generateProductUrlRewrites(\Magento\Catalog\Model\Category $cate
130133
* @param int|null $rootCategoryId
131134
* @return array
132135
*/
133-
public function getCategoryProductsUrlRewrites(
136+
private function getCategoryProductsUrlRewrites(
134137
\Magento\Catalog\Model\Category $category,
135138
$storeId,
136139
$saveRewriteHistory,
@@ -158,29 +161,13 @@ public function getCategoryProductsUrlRewrites(
158161
$product->setStoreId($storeId);
159162
$product->setData('save_rewrites_history', $saveRewriteHistory);
160163
$mergeDataProvider->merge(
161-
$this->getCategoryBasedProductRewriteGenerator()->generate($product, $category, $rootCategoryId)
164+
$this->categoryBasedProductRewriteGenerator->generate($product, $rootCategoryId)
162165
);
163166
}
164167

165168
return $mergeDataProvider->getData();
166169
}
167170

168-
/**
169-
* Retrieve generator, which use single category for different products
170-
*
171-
* @deprecated
172-
* @return \Magento\CatalogUrlRewrite\Model\CategoryBasedProductRewriteGenerator|mixed
173-
*/
174-
private function getCategoryBasedProductRewriteGenerator()
175-
{
176-
if (!$this->categoryBasedProductRewriteGenerator) {
177-
$this->categoryBasedProductRewriteGenerator = \Magento\Framework\App\ObjectManager::getInstance()
178-
->get(\Magento\CatalogUrlRewrite\Model\CategoryBasedProductRewriteGenerator::class);
179-
}
180-
181-
return $this->categoryBasedProductRewriteGenerator;
182-
}
183-
184171
/**
185172
* @param \Magento\Catalog\Model\Category $category
186173
* @return void
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\CatalogUrlRewrite\Test\Unit\Model;
7+
8+
use Magento\Catalog\Model\Category;
9+
use Magento\Catalog\Model\Product;
10+
use Magento\CatalogUrlRewrite\Model\CategoryProductUrlPathGenerator;
11+
use Magento\CatalogUrlRewrite\Model\ProductScopeRewriteGenerator;
12+
use Magento\Catalog\Model\ResourceModel\Category\Collection;
13+
14+
/**
15+
* Class CategoryProductUrlPathGeneratorTest
16+
*/
17+
class CategoryProductUrlPathGeneratorTest extends \PHPUnit_Framework_TestCase
18+
{
19+
/**
20+
* @var ProductScopeRewriteGenerator|\PHPUnit_Framework_MockObject_MockObject
21+
*/
22+
private $productScopeRewriteGeneratorMock;
23+
24+
/**
25+
* @var CategoryProductUrlPathGenerator
26+
*/
27+
private $generator;
28+
29+
public function setUp()
30+
{
31+
$this->productScopeRewriteGeneratorMock = $this->getMockBuilder(ProductScopeRewriteGenerator::class)
32+
->disableOriginalConstructor()
33+
->getMock();
34+
35+
$this->generator = new CategoryProductUrlPathGenerator(
36+
$this->productScopeRewriteGeneratorMock
37+
);
38+
}
39+
40+
public function testGenerationWithGlobalScope()
41+
{
42+
$categoryCollectionMock = $this->getMockBuilder(Collection::class)
43+
->disableOriginalConstructor()
44+
->getMock();
45+
$productMock = $this->getMockBuilder(Product::class)
46+
->disableOriginalConstructor()
47+
->getMock();
48+
$storeId = 1;
49+
$categoryId = 1;
50+
$urls = ['dummy-url.html'];
51+
52+
$productMock->expects($this->once())
53+
->method('getVisibility')
54+
->willReturn(2);
55+
$productMock->expects($this->once())
56+
->method('getStoreId')
57+
->willReturn($storeId);
58+
$productMock->expects($this->once())
59+
->method('getCategoryCollection')
60+
->willReturn($categoryCollectionMock);
61+
$categoryCollectionMock->expects($this->atLeastOnce())
62+
->method('addAttributeToSelect')
63+
->willReturnSelf();
64+
65+
$this->productScopeRewriteGeneratorMock->expects($this->once())
66+
->method('isGlobalScope')
67+
->with($storeId)
68+
->willReturn(true);
69+
$this->productScopeRewriteGeneratorMock->expects($this->once())
70+
->method('generateForGlobalScope')
71+
->with($categoryCollectionMock, $productMock, $categoryId)
72+
->willReturn($urls);
73+
74+
$this->assertEquals($urls, $this->generator->generate($productMock, $categoryId));
75+
}
76+
77+
public function testGenerationWithSpecificStore()
78+
{
79+
$categoryCollectionMock = $this->getMockBuilder(Collection::class)
80+
->disableOriginalConstructor()
81+
->getMock();
82+
$productMock = $this->getMockBuilder(Product::class)
83+
->disableOriginalConstructor()
84+
->getMock();
85+
$storeId = 1;
86+
$categoryId = 1;
87+
$urls = ['dummy-url.html'];
88+
89+
$productMock->expects($this->once())
90+
->method('getVisibility')
91+
->willReturn(2);
92+
$productMock->expects($this->once())
93+
->method('getStoreId')
94+
->willReturn($storeId);
95+
$productMock->expects($this->once())
96+
->method('getCategoryCollection')
97+
->willReturn($categoryCollectionMock);
98+
$categoryCollectionMock->expects($this->atLeastOnce())
99+
->method('addAttributeToSelect')
100+
->willReturnSelf();
101+
102+
$this->productScopeRewriteGeneratorMock->expects($this->once())
103+
->method('isGlobalScope')
104+
->with($storeId)
105+
->willReturn(false);
106+
$this->productScopeRewriteGeneratorMock->expects($this->once())
107+
->method('generateForSpecificStoreView')
108+
->with($storeId, $categoryCollectionMock, $productMock, $categoryId)
109+
->willReturn($urls);
110+
111+
$this->assertEquals($urls, $this->generator->generate($productMock, $categoryId));
112+
}
113+
}

app/code/Magento/CatalogUrlRewrite/Test/Unit/Observer/UrlRewriteHandlerTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Magento\Framework\Serialize\Serializer\Json;
1515
use Magento\UrlRewrite\Model\MergeDataProviderFactory;
1616
use Magento\UrlRewrite\Model\MergeDataProvider;
17+
use Magento\CatalogUrlRewrite\Model\CategoryProductUrlPathGenerator;
1718

1819
class UrlRewriteHandlerTest extends \PHPUnit_Framework_TestCase
1920
{
@@ -47,6 +48,11 @@ class UrlRewriteHandlerTest extends \PHPUnit_Framework_TestCase
4748
*/
4849
protected $collectionFactoryMock;
4950

51+
/**
52+
* @var CategoryProductUrlPathGenerator|\PHPUnit_Framework_MockObject_MockObject
53+
*/
54+
private $categoryBasedProductRewriteGeneratorMock;
55+
5056
/**
5157
* @var MergeDataProviderFactory|\PHPUnit_Framework_MockObject_MockObject
5258
*/
@@ -82,6 +88,9 @@ protected function setUp()
8288
$mergeDataProviderMock = $this->getMockBuilder(MergeDataProvider::class)
8389
->disableOriginalConstructor()
8490
->getMock();
91+
$this->categoryBasedProductRewriteGeneratorMock = $this->getMockBuilder(CategoryProductUrlPathGenerator::class)
92+
->disableOriginalConstructor()
93+
->getMock();
8594
$this->mergeDataProviderFactoryMock->expects($this->any())
8695
->method('create')
8796
->willReturn($mergeDataProviderMock);
@@ -96,6 +105,7 @@ protected function setUp()
96105
$this->productUrlRewriteGeneratorMock,
97106
$this->urlPersistMock,
98107
$this->collectionFactoryMock,
108+
$this->categoryBasedProductRewriteGeneratorMock,
99109
$this->mergeDataProviderFactoryMock,
100110
$this->serializerMock
101111
);

setup/src/Magento/Setup/Fixtures/ConfigsApplyFixture.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class ConfigsApplyFixture extends Fixture
1414
/**
1515
* @var int
1616
*/
17-
protected $priority = 150;
17+
protected $priority = 0;
1818

1919
/**
2020
* {@inheritdoc}

setup/src/Magento/Setup/Fixtures/FixtureModel.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,11 @@ public function loadFixtures()
109109
'fixtureModel' => $this,
110110
]
111111
);
112+
if (isset($this->fixtures[$fixture->getPriority()])) {
113+
throw new \InvalidArgumentException(
114+
sprintf('Duplicate priority %d in fixture %s', $fixture->getPriority(), $type)
115+
);
116+
}
112117
$this->fixtures[$fixture->getPriority()] = $fixture;
113118
}
114119

0 commit comments

Comments
 (0)