Skip to content

Commit 26730ca

Browse files
committed
Merge remote-tracking branch 'magento-ce/2.2-develop' into SPRINT-39-PR
2 parents 7384880 + 8363187 commit 26730ca

File tree

29 files changed

+540
-50
lines changed

29 files changed

+540
-50
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
);

app/code/Magento/Config/Model/Config/Backend/Email/Address.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class Address extends \Magento\Framework\App\Config\Value
2323
public function beforeSave()
2424
{
2525
$value = $this->getValue();
26-
if (!\Zend_Validate::is($value, 'EmailAddress')) {
26+
if (!\Zend_Validate::is($value, \Magento\Framework\Validator\EmailAddress::class)) {
2727
throw new LocalizedException(__('Please correct the email address: "%1".', $value));
2828
}
2929
return $this;

app/code/Magento/Customer/Controller/Account/ForgotPasswordPost.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public function execute()
6060
$resultRedirect = $this->resultRedirectFactory->create();
6161
$email = (string)$this->getRequest()->getPost('email');
6262
if ($email) {
63-
if (!\Zend_Validate::is($email, 'EmailAddress')) {
63+
if (!\Zend_Validate::is($email, \Magento\Framework\Validator\EmailAddress::class)) {
6464
$this->session->setForgottenEmail($email);
6565
$this->messageManager->addErrorMessage(__('Please correct the email address.'));
6666
return $resultRedirect->setPath('*/*/forgotpassword');

app/code/Magento/Customer/Model/Metadata/Form/AbstractData.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
namespace Magento\Customer\Model\Metadata\Form;
1212

1313
use Magento\Framework\Api\ArrayObjectSearch;
14+
use Magento\Framework\Validator\EmailAddress;
1415

1516
/**
1617
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -336,7 +337,7 @@ protected function _validateInputRule($value)
336337
__("'%value%' appears to be a DNS hostname but cannot extract TLD part")
337338
__("'%value%' appears to be a DNS hostname but cannot match TLD against known list")
338339
*/
339-
$validator = new \Zend_Validate_EmailAddress();
340+
$validator = new EmailAddress();
340341
$validator->setMessage(
341342
__('"%1" invalid type entered.', $label),
342343
\Zend_Validate_EmailAddress::INVALID
@@ -377,10 +378,6 @@ protected function _validateInputRule($value)
377378
__("'%value%' looks like an IP address, which is not an acceptable format."),
378379
\Zend_Validate_Hostname::IP_ADDRESS_NOT_ALLOWED
379380
);
380-
$validator->setMessage(
381-
__("'%value%' looks like a DNS hostname but we cannot match the TLD against known list."),
382-
\Zend_Validate_Hostname::UNKNOWN_TLD
383-
);
384381
$validator->setMessage(
385382
__("'%value%' looks like a DNS hostname but contains a dash in an invalid position."),
386383
\Zend_Validate_Hostname::INVALID_DASH

app/code/Magento/CustomerImportExport/Model/Import/AbstractCustomer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ protected function _checkUniqueKey(array $rowData, $rowNumber)
235235
$email = strtolower($rowData[static::COLUMN_EMAIL]);
236236
$website = $rowData[static::COLUMN_WEBSITE];
237237

238-
if (!\Zend_Validate::is($email, 'EmailAddress')) {
238+
if (!\Zend_Validate::is($email, \Magento\Framework\Validator\EmailAddress::class)) {
239239
$this->addRowError(static::ERROR_INVALID_EMAIL, $rowNumber, static::COLUMN_EMAIL);
240240
} elseif (!isset($this->_websiteCodeToId[$website])) {
241241
$this->addRowError(static::ERROR_INVALID_WEBSITE, $rowNumber, static::COLUMN_WEBSITE);

app/code/Magento/Eav/Model/Attribute/Data/AbstractData.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
use Magento\Framework\App\RequestInterface;
1212
use Magento\Framework\Exception\LocalizedException as CoreException;
13+
use Magento\Framework\Validator\EmailAddress;
1314

1415
/**
1516
* EAV Attribute Abstract Data Model
@@ -365,7 +366,7 @@ protected function _validateInputRule($value)
365366
__("'%value%' appears to be a DNS hostname but cannot extract TLD part")
366367
__("'%value%' appears to be a DNS hostname but cannot match TLD against known list")
367368
*/
368-
$validator = new \Zend_Validate_EmailAddress();
369+
$validator = new EmailAddress();
369370
$validator->setMessage(
370371
__('"%1" invalid type entered.', $label),
371372
\Zend_Validate_EmailAddress::INVALID
@@ -406,10 +407,6 @@ protected function _validateInputRule($value)
406407
__("'%value%' looks like an IP address, which is not an acceptable format."),
407408
\Zend_Validate_Hostname::IP_ADDRESS_NOT_ALLOWED
408409
);
409-
$validator->setMessage(
410-
__("'%value%' looks like a DNS hostname but we cannot match the TLD against known list."),
411-
\Zend_Validate_Hostname::UNKNOWN_TLD
412-
);
413410
$validator->setMessage(
414411
__("'%value%' looks like a DNS hostname but contains a dash in an invalid position."),
415412
\Zend_Validate_Hostname::INVALID_DASH

0 commit comments

Comments
 (0)