Skip to content

Commit a701421

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

File tree

6 files changed

+64
-177
lines changed

6 files changed

+64
-177
lines changed

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

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

89
/**
910
* Product initialization helper class
10-
*
11-
* @package Magento\Catalog\Controller\Adminhtml\Product\Initialization
1211
*/
1312
class Helper
1413
{
@@ -67,18 +66,16 @@ public function __construct(
6766
}
6867

6968
/**
70-
* Initialize product from data
69+
* Initialize product before saving
7170
*
7271
* @param \Magento\Catalog\Model\Product $product
73-
* @param array $productData
7472
* @return \Magento\Catalog\Model\Product
75-
* @throws \Magento\Framework\Exception\LocalizedException
7673
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
7774
* @SuppressWarnings(PHPMD.NPathComplexity)
7875
*/
79-
public function initializeFromData(\Magento\Catalog\Model\Product $product, array $productData = null)
76+
public function initialize(\Magento\Catalog\Model\Product $product)
8077
{
81-
$productData = $productData ?: $this->request->getPost('product', []);
78+
$productData = $this->request->getPost('product', []);
8279
unset($productData['custom_attributes']);
8380
unset($productData['extension_attributes']);
8481

@@ -154,7 +151,7 @@ public function initializeFromData(\Magento\Catalog\Model\Product $product, arra
154151
foreach ($options as &$customOptionData) {
155152
if (isset($customOptionData['values'])) {
156153
$customOptionData['values'] = array_filter($customOptionData['values'], function ($valueData) {
157-
return empty($valueData['is_delete']);
154+
return !($valueData['option_type_id'] == '-1' && !empty($valueData['is_delete']));
158155
});
159156
}
160157
}
@@ -168,18 +165,6 @@ public function initializeFromData(\Magento\Catalog\Model\Product $product, arra
168165
return $product;
169166
}
170167

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-
183168
/**
184169
* Merge product and default options for product
185170
*

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

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,9 @@
88

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

1312
/**
1413
* Class that handle new product creation
15-
*
16-
* @package Magento\Catalog\Controller\Adminhtml\Product
1714
*/
1815
class NewAction extends \Magento\Catalog\Controller\Adminhtml\Product
1916
{
@@ -32,11 +29,6 @@ class NewAction extends \Magento\Catalog\Controller\Adminhtml\Product
3229
*/
3330
protected $resultForwardFactory;
3431

35-
/**
36-
* @var Initialization\Helper
37-
*/
38-
protected $initializationHelper;
39-
4032
/**
4133
* @param Action\Context $context
4234
* @param Builder $productBuilder
@@ -80,7 +72,7 @@ public function execute()
8072
if ($productData) {
8173
$stockData = isset($productData['stock_data']) ? $productData['stock_data'] : [];
8274
$productData['stock_data'] = $this->stockFilter->filter($stockData);
83-
$product = $this->getInitializationHelper()->initializeFromData($product, $productData);
75+
$product->addData($productData);
8476
}
8577

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

10496
return $resultPage;
10597
}
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-
}
11898
}

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

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

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

1312
/**
1413
* Product validate
@@ -19,7 +18,6 @@ class Validate extends \Magento\Catalog\Controller\Adminhtml\Product
1918
{
2019
/**
2120
* @var \Magento\Framework\Stdlib\DateTime\Filter\Date
22-
* @deprecated
2321
*/
2422
protected $_dateFilter;
2523

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

44-
/**
45-
* @var Initialization\Helper
46-
*/
47-
protected $initializationHelper;
48-
4942
/**
5043
* @param Action\Context $context
5144
* @param Builder $productBuilder
@@ -85,7 +78,7 @@ public function execute()
8578
$response->setError(false);
8679

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

9083
if ($productData && !isset($productData['stock_data']['use_config_manage_stock'])) {
9184
$productData['stock_data']['use_config_manage_stock'] = 0;
@@ -109,7 +102,19 @@ public function execute()
109102
if ($productId) {
110103
$product->load($productId);
111104
}
112-
$product = $this->getInitializationHelper()->initializeFromData($product, $productData);
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);
113118

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

136141
return $this->resultJsonFactory->create()->setJsonData($response->toJson());
137142
}
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-
}
150143
}

app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Initialization/HelperTest.php

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

89
use Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper;
@@ -155,8 +156,8 @@ public function testInitialize()
155156
'option1' => ['is_delete' => false, 'name' => 'name1', 'price' => 'price1', 'option_id' => '13'],
156157
'option2' => ['is_delete' => false, 'name' => 'name1', 'price' => 'price1', 'option_id' => '14',
157158
'values' => [
158-
'value1' => ['is_delete' =>''],
159-
'value2' => ['is_delete' =>'1']
159+
'value1' => ['option_type_id' => 1, 'is_delete' =>''],
160+
'value2' => ['option_type_id' => '-1', 'is_delete' =>'1']
160161
]
161162
],
162163
];

app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/NewActionTest.php

Lines changed: 16 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,11 @@
44
* Copyright © 2016 Magento. All rights reserved.
55
* See COPYING.txt for license details.
66
*/
7-
namespace Magento\Catalog\Test\Unit\Controller\Adminhtml\Product;
87

9-
use Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper;
10-
use Magento\Catalog\Controller\Adminhtml\Product\Initialization\StockDataFilter;
11-
use Magento\Catalog\Controller\Adminhtml\Product\NewAction;
8+
namespace Magento\Catalog\Test\Unit\Controller\Adminhtml\Product;
129

1310
/**
1411
* Class to test new product creation
15-
*
16-
* @package Magento\Catalog\Test\Unit\Controller\Adminhtml\Product
1712
*/
1813
class NewActionTest extends \Magento\Catalog\Test\Unit\Controller\Adminhtml\ProductTest
1914
{
@@ -28,11 +23,6 @@ class NewActionTest extends \Magento\Catalog\Test\Unit\Controller\Adminhtml\Prod
2823
/** @var \Magento\Catalog\Model\Product|\PHPUnit_Framework_MockObject_MockObject */
2924
protected $product;
3025

31-
/**
32-
* @var Helper|\PHPUnit_Framework_MockObject_MockObject
33-
*/
34-
protected $initializationHelper;
35-
3626
protected function setUp()
3727
{
3828
$this->productBuilder = $this->getMock(
@@ -42,7 +32,8 @@ protected function setUp()
4232
'',
4333
false
4434
);
45-
$this->product = $this->getMockBuilder(\Magento\Catalog\Model\Product::class)->disableOriginalConstructor()
35+
$this->product = $this->getMockBuilder(\Magento\Catalog\Model\Product::class)
36+
->disableOriginalConstructor()
4637
->setMethods(['addData', 'getTypeId', 'getStoreId', '__sleep', '__wakeup'])->getMock();
4738
$this->product->expects($this->any())->method('getTypeId')->will($this->returnValue('simple'));
4839
$this->product->expects($this->any())->method('getStoreId')->will($this->returnValue('1'));
@@ -70,24 +61,19 @@ protected function setUp()
7061
$resultForwardFactory->expects($this->any())
7162
->method('create')
7263
->willReturn($this->resultForward);
73-
$this->initializationHelper = $this->getMock(Helper::class, [], [], '', false);
74-
$stockDataFilter = $this->getMockBuilder(StockDataFilter::class)
75-
->disableOriginalConstructor()->getMock();
7664

77-
$this->action = $this->getMockBuilder(NewAction::class)
78-
->setMethods(['getInitializationHelper'])
79-
->setConstructorArgs(
80-
[
81-
'context' => $this->initContext(),
82-
'productBuilder' => $this->productBuilder,
83-
'stockFilter' => $stockDataFilter,
84-
'resultPageFactory' => $resultPageFactory,
85-
'resultForwardFactory' => $resultForwardFactory,
86-
]
87-
)->getMock();
65+
$stockFilter = $this->getMockBuilder(
66+
\Magento\Catalog\Controller\Adminhtml\Product\Initialization\StockDataFilter::class
67+
)->disableOriginalConstructor()->getMock();
68+
69+
$this->action = new \Magento\Catalog\Controller\Adminhtml\Product\NewAction(
70+
$this->initContext(),
71+
$this->productBuilder,
72+
$stockFilter,
73+
$resultPageFactory,
74+
$resultForwardFactory
75+
);
8876

89-
$this->action->method('getInitializationHelper')->willReturn($this->initializationHelper);
90-
$this->action->method('getRequest')->willReturn($this->request);
9177
$this->resultPage->expects($this->atLeastOnce())
9278
->method('getLayout')
9379
->willReturn($this->layout);
@@ -107,15 +93,10 @@ public function testExecuteObtainsProductDataFromSession()
10793
$this->action->getRequest()->expects($this->any())->method('getFullActionName')
10894
->willReturn('catalog_product_new');
10995

110-
$productData = ['name' => 'test-name', 'stock_data' => null];
11196
$this->session->expects($this->any())->method('getProductData')
112-
->willReturn(['product' => $productData]);
97+
->willReturn(['product' => ['name' => 'test-name']]);
11398

114-
$this->initializationHelper
115-
->expects($this->once())
116-
->method('initializeFromData')
117-
->with($this->product, $productData)
118-
->willReturn($this->product);
99+
$this->product->expects($this->once())->method('addData')->with(['name' => 'test-name', 'stock_data' => null]);
119100

120101
$this->action->execute();
121102
}

0 commit comments

Comments
 (0)