Skip to content

Commit b953300

Browse files
committed
MAGETWO-62647: "Invalid option value" Error message is shown when delete option row without data
1 parent ea6f29c commit b953300

File tree

6 files changed

+307
-128
lines changed

6 files changed

+307
-128
lines changed

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

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55
*/
66
namespace Magento\Catalog\Controller\Adminhtml\Product\Initialization;
77

8+
/**
9+
* Product initialization helper class
10+
*
11+
* @package Magento\Catalog\Controller\Adminhtml\Product\Initialization
12+
*/
813
class Helper
914
{
1015
/**
@@ -62,16 +67,18 @@ public function __construct(
6267
}
6368

6469
/**
65-
* Initialize product before saving
70+
* Initialize product from data
6671
*
6772
* @param \Magento\Catalog\Model\Product $product
73+
* @param array $productData
6874
* @return \Magento\Catalog\Model\Product
75+
* @throws \Magento\Framework\Exception\LocalizedException
6976
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
7077
* @SuppressWarnings(PHPMD.NPathComplexity)
7178
*/
72-
public function initialize(\Magento\Catalog\Model\Product $product)
79+
public function initializeFromData(\Magento\Catalog\Model\Product $product, array $productData = null)
7380
{
74-
$productData = $this->request->getPost('product');
81+
$productData = $productData ?: $this->request->getPost('product', []);
7582
unset($productData['custom_attributes']);
7683
unset($productData['extension_attributes']);
7784

@@ -144,6 +151,13 @@ public function initialize(\Magento\Catalog\Model\Product $product)
144151
$productData['options'],
145152
$this->request->getPost('options_use_default')
146153
);
154+
foreach ($options as &$customOptionData) {
155+
if (isset($customOptionData['values'])) {
156+
$customOptionData['values'] = array_filter($customOptionData['values'], function ($valueData) {
157+
return empty($valueData['is_delete']);
158+
});
159+
}
160+
}
147161
$product->setProductOptions($options);
148162
}
149163

@@ -154,6 +168,18 @@ public function initialize(\Magento\Catalog\Model\Product $product)
154168
return $product;
155169
}
156170

171+
/**
172+
* Initialize product before saving
173+
*
174+
* @param \Magento\Catalog\Model\Product $product
175+
* @return \Magento\Catalog\Model\Product
176+
*/
177+
public function initialize(\Magento\Catalog\Model\Product $product)
178+
{
179+
$productData = $this->request->getPost('product', []);
180+
return $this->initializeFromData($product, $productData);
181+
}
182+
157183
/**
158184
* Merge product and default options for product
159185
*

app/code/Magento/Catalog/Controller/Adminhtml/Product/NewAction.php

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@
88

99
use Magento\Backend\App\Action;
1010
use Magento\Catalog\Controller\Adminhtml\Product;
11+
use Magento\Framework\App\ObjectManager;
1112

13+
/**
14+
* Class that handle new product creation
15+
*
16+
* @package Magento\Catalog\Controller\Adminhtml\Product
17+
*/
1218
class NewAction extends \Magento\Catalog\Controller\Adminhtml\Product
1319
{
1420
/**
@@ -26,6 +32,11 @@ class NewAction extends \Magento\Catalog\Controller\Adminhtml\Product
2632
*/
2733
protected $resultForwardFactory;
2834

35+
/**
36+
* @var Initialization\Helper
37+
*/
38+
protected $initializationHelper;
39+
2940
/**
3041
* @param Action\Context $context
3142
* @param Builder $productBuilder
@@ -69,7 +80,7 @@ public function execute()
6980
if ($productData) {
7081
$stockData = isset($productData['stock_data']) ? $productData['stock_data'] : [];
7182
$productData['stock_data'] = $this->stockFilter->filter($stockData);
72-
$product->addData($productData);
83+
$product = $this->getInitializationHelper()->initializeFromData($product, $productData);
7384
}
7485

7586
$this->_eventManager->dispatch('catalog_product_new_action', ['product' => $product]);
@@ -92,4 +103,16 @@ public function execute()
92103

93104
return $resultPage;
94105
}
106+
107+
/**
108+
* @deprecated
109+
* @return Initialization\Helper
110+
*/
111+
protected function getInitializationHelper()
112+
{
113+
if (null === $this->initializationHelper) {
114+
$this->initializationHelper = ObjectManager::getInstance()->get(Initialization\Helper::class);
115+
}
116+
return $this->initializationHelper;
117+
}
95118
}

app/code/Magento/Catalog/Controller/Adminhtml/Product/Validate.php

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
use Magento\Backend\App\Action;
1010
use Magento\Catalog\Controller\Adminhtml\Product;
11+
use Magento\Framework\App\ObjectManager;
1112

1213
/**
1314
* Product validate
@@ -18,6 +19,7 @@ class Validate extends \Magento\Catalog\Controller\Adminhtml\Product
1819
{
1920
/**
2021
* @var \Magento\Framework\Stdlib\DateTime\Filter\Date
22+
* @deprecated
2123
*/
2224
protected $_dateFilter;
2325

@@ -39,6 +41,11 @@ class Validate extends \Magento\Catalog\Controller\Adminhtml\Product
3941
/** @var \Magento\Catalog\Model\ProductFactory */
4042
protected $productFactory;
4143

44+
/**
45+
* @var Initialization\Helper
46+
*/
47+
protected $initializationHelper;
48+
4249
/**
4350
* @param Action\Context $context
4451
* @param Builder $productBuilder
@@ -78,7 +85,7 @@ public function execute()
7885
$response->setError(false);
7986

8087
try {
81-
$productData = $this->getRequest()->getPost('product');
88+
$productData = $this->getRequest()->getPost('product', []);
8289

8390
if ($productData && !isset($productData['stock_data']['use_config_manage_stock'])) {
8491
$productData['stock_data']['use_config_manage_stock'] = 0;
@@ -102,19 +109,7 @@ public function execute()
102109
if ($productId) {
103110
$product->load($productId);
104111
}
105-
106-
$dateFieldFilters = [];
107-
$attributes = $product->getAttributes();
108-
foreach ($attributes as $attrKey => $attribute) {
109-
if ($attribute->getBackend()->getType() == 'datetime') {
110-
if (array_key_exists($attrKey, $productData) && $productData[$attrKey] != '') {
111-
$dateFieldFilters[$attrKey] = $this->_dateFilter;
112-
}
113-
}
114-
}
115-
$inputFilter = new \Zend_Filter_Input($dateFieldFilters, [], $productData);
116-
$productData = $inputFilter->getUnescaped();
117-
$product->addData($productData);
112+
$product = $this->getInitializationHelper()->initializeFromData($product, $productData);
118113

119114
/* set restrictions for date ranges */
120115
$resource = $product->getResource();
@@ -140,4 +135,16 @@ public function execute()
140135

141136
return $this->resultJsonFactory->create()->setJsonData($response->toJson());
142137
}
138+
139+
/**
140+
* @return Initialization\Helper
141+
* @deprecated
142+
*/
143+
protected function getInitializationHelper()
144+
{
145+
if (null === $this->initializationHelper) {
146+
$this->initializationHelper = ObjectManager::getInstance()->get(Initialization\Helper::class);
147+
}
148+
return $this->initializationHelper;
149+
}
143150
}

0 commit comments

Comments
 (0)