Skip to content

Commit 78e0d13

Browse files
committed
Merge remote-tracking branch 'origin/MAGETWO-66217' into 2.3-develop-pr21
2 parents a393505 + 6a0e8cb commit 78e0d13

File tree

3 files changed

+144
-75
lines changed

3 files changed

+144
-75
lines changed

app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper.php

Lines changed: 21 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,18 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
67
namespace Magento\Catalog\Controller\Adminhtml\Product\Initialization;
78

89
use Magento\Catalog\Api\Data\ProductCustomOptionInterfaceFactory as CustomOptionFactory;
910
use Magento\Catalog\Api\Data\ProductLinkInterfaceFactory as ProductLinkFactory;
11+
use Magento\Catalog\Api\ProductRepositoryInterface;
1012
use Magento\Catalog\Api\ProductRepositoryInterface\Proxy as ProductRepository;
13+
use Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\AttributeDefaultValueFilter;
1114
use Magento\Catalog\Model\Product;
1215
use Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks;
1316
use Magento\Catalog\Model\Product\Link\Resolver as LinkResolver;
17+
use Magento\Catalog\Model\Product\LinkTypeProvider;
1418
use Magento\Framework\App\ObjectManager;
1519
use Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\AttributeFilter;
1620

@@ -81,7 +85,7 @@ class Helper
8185
private $dateTimeFilter;
8286

8387
/**
84-
* @var \Magento\Catalog\Model\Product\LinkTypeProvider
88+
* @var LinkTypeProvider
8589
*/
8690
private $linkTypeProvider;
8791

@@ -99,10 +103,10 @@ class Helper
99103
* @param ProductLinks $productLinks
100104
* @param \Magento\Backend\Helper\Js $jsHelper
101105
* @param \Magento\Framework\Stdlib\DateTime\Filter\Date $dateFilter
102-
* @param \Magento\Catalog\Api\Data\ProductCustomOptionInterfaceFactory|null $customOptionFactory
103-
* @param \Magento\Catalog\Api\Data\ProductLinkInterfaceFactory|null $productLinkFactory
104-
* @param \Magento\Catalog\Api\ProductRepositoryInterface|null $productRepository
105-
* @param \Magento\Catalog\Model\Product\LinkTypeProvider|null $linkTypeProvider
106+
* @param CustomOptionFactory|null $customOptionFactory
107+
* @param ProductLinkFactory |null $productLinkFactory
108+
* @param ProductRepositoryInterface|null $productRepository
109+
* @param LinkTypeProvider|null $linkTypeProvider
106110
* @param AttributeFilter|null $attributeFilter
107111
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
108112
*/
@@ -113,10 +117,10 @@ public function __construct(
113117
\Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks $productLinks,
114118
\Magento\Backend\Helper\Js $jsHelper,
115119
\Magento\Framework\Stdlib\DateTime\Filter\Date $dateFilter,
116-
\Magento\Catalog\Api\Data\ProductCustomOptionInterfaceFactory $customOptionFactory = null,
117-
\Magento\Catalog\Api\Data\ProductLinkInterfaceFactory $productLinkFactory = null,
118-
\Magento\Catalog\Api\ProductRepositoryInterface $productRepository = null,
119-
\Magento\Catalog\Model\Product\LinkTypeProvider $linkTypeProvider = null,
120+
CustomOptionFactory $customOptionFactory = null,
121+
ProductLinkFactory $productLinkFactory = null,
122+
ProductRepositoryInterface $productRepository = null,
123+
LinkTypeProvider $linkTypeProvider = null,
120124
AttributeFilter $attributeFilter = null
121125
) {
122126
$this->request = $request;
@@ -125,16 +129,13 @@ public function __construct(
125129
$this->productLinks = $productLinks;
126130
$this->jsHelper = $jsHelper;
127131
$this->dateFilter = $dateFilter;
128-
$this->customOptionFactory = $customOptionFactory ?: \Magento\Framework\App\ObjectManager::getInstance()
129-
->get(\Magento\Catalog\Api\Data\ProductCustomOptionInterfaceFactory::class);
130-
$this->productLinkFactory = $productLinkFactory ?: \Magento\Framework\App\ObjectManager::getInstance()
131-
->get(\Magento\Catalog\Api\Data\ProductLinkInterfaceFactory::class);
132-
$this->productRepository = $productRepository ?: \Magento\Framework\App\ObjectManager::getInstance()
133-
->get(\Magento\Catalog\Api\ProductRepositoryInterface::class);
134-
$this->linkTypeProvider = $linkTypeProvider ?: \Magento\Framework\App\ObjectManager::getInstance()
135-
->get(\Magento\Catalog\Model\Product\LinkTypeProvider::class);
136-
$this->attributeFilter = $attributeFilter ?: \Magento\Framework\App\ObjectManager::getInstance()
137-
->get(AttributeFilter::class);
132+
133+
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
134+
$this->customOptionFactory = $customOptionFactory ?: $objectManager->get(CustomOptionFactory::class);
135+
$this->productLinkFactory = $productLinkFactory ?: $objectManager->get(ProductLinkFactory::class);
136+
$this->productRepository = $productRepository ?: $objectManager->get(ProductRepositoryInterface::class);
137+
$this->linkTypeProvider = $linkTypeProvider ?: $objectManager->get(LinkTypeProvider::class);
138+
$this->attributeFilter = $attributeFilter ?: $objectManager->get(AttributeFilter::class);
138139
}
139140

140141
/**
@@ -150,8 +151,7 @@ public function __construct(
150151
*/
151152
public function initializeFromData(\Magento\Catalog\Model\Product $product, array $productData)
152153
{
153-
unset($productData['custom_attributes']);
154-
unset($productData['extension_attributes']);
154+
unset($productData['custom_attributes'], $productData['extension_attributes']);
155155

156156
if ($productData) {
157157
$stockData = isset($productData['stock_data']) ? $productData['stock_data'] : [];
@@ -199,28 +199,13 @@ public function initializeFromData(\Magento\Catalog\Model\Product $product, arra
199199
$productData['tier_price'] = isset($productData['tier_price']) ? $productData['tier_price'] : [];
200200

201201
$useDefaults = (array)$this->request->getPost('use_default', []);
202-
203202
$productData = $this->attributeFilter->prepareProductAttributes($product, $productData, $useDefaults);
204-
205203
$product->addData($productData);
206204

207205
if ($wasLockedMedia) {
208206
$product->lockAttribute('media');
209207
}
210208

211-
/**
212-
* Check "Use Default Value" checkboxes values
213-
*/
214-
foreach ($useDefaults as $attributeCode => $useDefaultState) {
215-
if ($useDefaultState) {
216-
$product->setData($attributeCode, null);
217-
// UI component sends value even if field is disabled, so 'Use Config Settings' must be reset to false
218-
if ($product->hasData('use_config_' . $attributeCode)) {
219-
$product->setData('use_config_' . $attributeCode, false);
220-
}
221-
}
222-
}
223-
224209
$product = $this->setProductLinks($product);
225210
$product = $this->fillProductOptions($product, $productOptions);
226211

app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/AttributeFilter.php

Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,17 @@ class AttributeFilter
2828
* @param array $useDefaults
2929
* @return array
3030
*/
31-
public function prepareProductAttributes(Product $product, array $productData, array $useDefaults)
31+
public function prepareProductAttributes(Product $product, array $productData, array $useDefaults): array
3232
{
33-
foreach ($productData as $attribute => $value) {
34-
if ($this->isAttributeShouldNotBeUpdated($product, $useDefaults, $attribute, $value)) {
35-
unset($productData[$attribute]);
33+
$attributeList = $product->getAttributes();
34+
foreach ($productData as $attributeCode => $attributeValue) {
35+
if ($this->isAttributeShouldNotBeUpdated($product, $useDefaults, $attributeCode, $attributeValue)) {
36+
unset($productData[$attributeCode]);
37+
}
38+
39+
if (isset($useDefaults[$attributeCode]) && $useDefaults[$attributeCode] === '1') {
40+
$productData = $this->prepareDefaultData($attributeList, $attributeCode, $productData);
41+
$productData = $this->prepareConfigData($product, $attributeCode, $productData);
3642
}
3743
}
3844

@@ -41,14 +47,54 @@ public function prepareProductAttributes(Product $product, array $productData, a
4147

4248
/**
4349
* @param Product $product
44-
* @param $useDefaults
45-
* @param $attribute
46-
* @param $value
50+
* @param string $attributeCode
51+
* @param array $productData
52+
* @return array
53+
*/
54+
private function prepareConfigData(Product $product, string $attributeCode, array $productData): array
55+
{
56+
// UI component sends value even if field is disabled, so 'Use Config Settings' must be reset to false
57+
if ($product->hasData('use_config_' . $attributeCode)) {
58+
$productData['use_config_' . $attributeCode] = false;
59+
}
60+
61+
return $productData;
62+
}
63+
64+
/**
65+
* @param array $attributeList
66+
* @param string $attributeCode
67+
* @param array $productData
68+
* @return array
69+
*/
70+
private function prepareDefaultData(array $attributeList, string $attributeCode, array $productData): array
71+
{
72+
if (isset($attributeList[$attributeCode])) {
73+
/** @var \Magento\Catalog\Model\ResourceModel\Eav\Attribute $attribute */
74+
$attribute = $attributeList[$attributeCode];
75+
$attributeType = $attribute->getBackendType();
76+
// For non-numberic types set the attributeValue to 'false' to trigger their removal from the db
77+
if ($attributeType === 'varchar' || $attributeType === 'text' || $attributeType === 'datetime') {
78+
$attribute->setIsRequired(false);
79+
$productData[$attributeCode] = false;
80+
} else {
81+
$productData[$attributeCode] = null;
82+
}
83+
}
84+
85+
return $productData;
86+
}
87+
88+
/**
89+
* @param Product $product
90+
* @param array $useDefaults
91+
* @param string $attribute
92+
* @param mixed $value
4793
* @return bool
4894
*/
49-
private function isAttributeShouldNotBeUpdated(Product $product, $useDefaults, $attribute, $value) : bool
95+
private function isAttributeShouldNotBeUpdated(Product $product, array $useDefaults, $attribute, $value): bool
5096
{
51-
$considerUseDefaultsAttribute = !isset($useDefaults[$attribute]) || $useDefaults[$attribute] === "1";
97+
$considerUseDefaultsAttribute = !isset($useDefaults[$attribute]) || $useDefaults[$attribute] === '1';
5298

5399
return ($value === '' && $considerUseDefaultsAttribute && !$product->getData($attribute));
54100
}

0 commit comments

Comments
 (0)