Skip to content

Commit 052e789

Browse files
committed
Merge pull request #514 from magento-vanilla/JS-472
[Epam + Dragons + Vanilla] Bugfixes
2 parents 2507c34 + 2702378 commit 052e789

File tree

44 files changed

+621
-263
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+621
-263
lines changed

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

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,17 +94,17 @@ public function __construct(
9494
}
9595

9696
/**
97-
* Initialize product before saving
97+
* Initialize product from data
9898
*
9999
* @param \Magento\Catalog\Model\Product $product
100+
* @param array $productData
100101
* @return \Magento\Catalog\Model\Product
101102
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
102103
* @SuppressWarnings(PHPMD.NPathComplexity)
103104
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
104105
*/
105-
public function initialize(\Magento\Catalog\Model\Product $product)
106+
public function initializeFromData(\Magento\Catalog\Model\Product $product, array $productData)
106107
{
107-
$productData = (array)$this->request->getPost('product', []);
108108
unset($productData['custom_attributes']);
109109
unset($productData['extension_attributes']);
110110

@@ -150,6 +150,12 @@ public function initialize(\Magento\Catalog\Model\Product $product)
150150
$inputFilter = new \Zend_Filter_Input($dateFieldFilters, [], $productData);
151151
$productData = $inputFilter->getUnescaped();
152152

153+
if (isset($productData['options'])) {
154+
$productOptions = $productData['options'];
155+
unset($productData['options']);
156+
} else {
157+
$productOptions = [];
158+
}
153159
$product->addData($productData);
154160

155161
if ($wasLockedMedia) {
@@ -176,15 +182,20 @@ public function initialize(\Magento\Catalog\Model\Product $product)
176182
/**
177183
* Initialize product options
178184
*/
179-
if (isset($productData['options']) && !$product->getOptionsReadonly()) {
185+
if ($productOptions && !$product->getOptionsReadonly()) {
180186
// mark custom options that should to fall back to default value
181187
$options = $this->mergeProductOptions(
182-
$productData['options'],
188+
$productOptions,
183189
$this->request->getPost('options_use_default')
184190
);
185191
$customOptions = [];
186192
foreach ($options as $customOptionData) {
187193
if (empty($customOptionData['is_delete'])) {
194+
if (isset($customOptionData['values'])) {
195+
$customOptionData['values'] = array_filter($customOptionData['values'], function ($valueData) {
196+
return empty($valueData['is_delete']);
197+
});
198+
}
188199
$customOption = $this->getCustomOptionFactory()->create(['data' => $customOptionData]);
189200
$customOption->setProductSku($product->getSku());
190201
$customOption->setOptionId(null);
@@ -200,6 +211,18 @@ public function initialize(\Magento\Catalog\Model\Product $product)
200211

201212
return $product;
202213
}
214+
215+
/**
216+
* Initialize product before saving
217+
*
218+
* @param \Magento\Catalog\Model\Product $product
219+
* @return \Magento\Catalog\Model\Product
220+
*/
221+
public function initialize(\Magento\Catalog\Model\Product $product)
222+
{
223+
$productData = $this->request->getPost('product', []);
224+
return $this->initializeFromData($product, $productData);
225+
}
203226

204227
/**
205228
* Setting product links

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

Lines changed: 19 additions & 1 deletion
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
class NewAction extends \Magento\Catalog\Controller\Adminhtml\Product
1314
{
@@ -26,6 +27,11 @@ class NewAction extends \Magento\Catalog\Controller\Adminhtml\Product
2627
*/
2728
protected $resultForwardFactory;
2829

30+
/**
31+
* @var Initialization\Helper
32+
*/
33+
protected $initializationHelper;
34+
2935
/**
3036
* @param Action\Context $context
3137
* @param Builder $productBuilder
@@ -69,7 +75,7 @@ public function execute()
6975
if ($productData) {
7076
$stockData = isset($productData['stock_data']) ? $productData['stock_data'] : [];
7177
$productData['stock_data'] = $this->stockFilter->filter($stockData);
72-
$product->addData($productData);
78+
$product = $this->getInitializationHelper()->initializeFromData($product, $productData);
7379
}
7480

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

9399
return $resultPage;
94100
}
101+
102+
/**
103+
* @return Initialization\Helper
104+
* @deprecated
105+
*/
106+
protected function getInitializationHelper()
107+
{
108+
if (null === $this->initializationHelper) {
109+
$this->initializationHelper = ObjectManager::getInstance()->get(Initialization\Helper::class);
110+
}
111+
return $this->initializationHelper;
112+
}
95113
}

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()->setData($response);
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
}

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,6 @@ protected function setUp()
166166
->disableOriginalConstructor()
167167
->getMock();
168168

169-
$this->customOptionFactoryMock->expects($this->any())
170-
->method('create')
171-
->with(['data' => ['is_delete' => false]])
172-
->willReturn($this->customOptionMock);
173169
$this->productLinksMock->expects($this->any())
174170
->method('initializeLinks')
175171
->willReturn($this->productMock);
@@ -215,9 +211,13 @@ public function testInitialize()
215211
$this->customOptionMock->expects($this->once())
216212
->method('setOptionId');
217213

214+
$optionsData = [
215+
'option1' => ['is_delete' => true, 'name' => 'name1', 'price' => 'price1'],
216+
'option2' => ['is_delete' => false, 'name' => 'name1', 'price' => 'price1'],
217+
];
218218
$productData = [
219219
'stock_data' => ['stock_data'],
220-
'options' => ['option1' => ['is_delete' => true], 'option2' => ['is_delete' => false]]
220+
'options' => $optionsData,
221221
];
222222
$attributeNonDate = $this->getMockBuilder(\Magento\Catalog\Model\ResourceModel\Eav\Attribute::class)
223223
->disableOriginalConstructor()
@@ -292,6 +292,7 @@ public function testInitialize()
292292

293293
$productData['category_ids'] = [];
294294
$productData['website_ids'] = [];
295+
unset($productData['options']);
295296

296297
$this->productMock->expects($this->once())
297298
->method('addData')
@@ -305,6 +306,11 @@ public function testInitialize()
305306
$this->productMock->expects($this->any())
306307
->method('getOptionsReadOnly')
307308
->willReturn(false);
309+
310+
$this->customOptionFactoryMock->expects($this->any())
311+
->method('create')
312+
->with(['data' => $optionsData['option2']])
313+
->willReturn($this->customOptionMock);
308314
$this->productMock->expects($this->once())
309315
->method('setOptions')
310316
->with([$this->customOptionMock]);

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

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,33 @@
66
*/
77
namespace Magento\Catalog\Test\Unit\Controller\Adminhtml\Product;
88

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;
12+
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
13+
914
class NewActionTest extends \Magento\Catalog\Test\Unit\Controller\Adminhtml\ProductTest
1015
{
11-
/** @var \Magento\Catalog\Controller\Adminhtml\Product\NewAction */
16+
/** @var NewAction */
1217
protected $action;
18+
1319
/** @var \Magento\Backend\Model\View\Result\Page|\PHPUnit_Framework_MockObject_MockObject */
1420
protected $resultPage;
21+
1522
/** @var \Magento\Backend\Model\View\Result\Forward|\PHPUnit_Framework_MockObject_MockObject */
1623
protected $resultForward;
24+
1725
/** @var \Magento\Catalog\Controller\Adminhtml\Product\Builder|\PHPUnit_Framework_MockObject_MockObject */
1826
protected $productBuilder;
27+
1928
/** @var \Magento\Catalog\Model\Product|\PHPUnit_Framework_MockObject_MockObject */
2029
protected $product;
2130

31+
/**
32+
* @var Helper|\PHPUnit_Framework_MockObject_MockObject
33+
*/
34+
protected $initializationHelper;
35+
2236
protected function setUp()
2337
{
2438
$this->productBuilder = $this->getMock(
@@ -56,14 +70,20 @@ protected function setUp()
5670
$resultForwardFactory->expects($this->any())
5771
->method('create')
5872
->willReturn($this->resultForward);
73+
$this->initializationHelper = $this->getMock(Helper::class, [], [], '', false);
74+
$stockDataFilter = $this->getMockBuilder(StockDataFilter::class)
75+
->disableOriginalConstructor()->getMock();
5976

60-
$this->action = new \Magento\Catalog\Controller\Adminhtml\Product\NewAction(
61-
$this->initContext(),
62-
$this->productBuilder,
63-
$this->getMockBuilder('Magento\Catalog\Controller\Adminhtml\Product\Initialization\StockDataFilter')
64-
->disableOriginalConstructor()->getMock(),
65-
$resultPageFactory,
66-
$resultForwardFactory
77+
$this->action = (new ObjectManager($this))->getObject(
78+
NewAction::class,
79+
[
80+
'context' => $this->initContext(),
81+
'productBuilder' => $this->productBuilder,
82+
'stockFilter' => $stockDataFilter,
83+
'resultPageFactory' => $resultPageFactory,
84+
'resultForwardFactory' => $resultForwardFactory,
85+
'initializationHelper' => $this->initializationHelper,
86+
]
6787
);
6888

6989
$this->resultPage->expects($this->atLeastOnce())
@@ -85,10 +105,15 @@ public function testExecuteObtainsProductDataFromSession()
85105
$this->action->getRequest()->expects($this->any())->method('getFullActionName')
86106
->willReturn('catalog_product_new');
87107

108+
$productData = ['name' => 'test-name', 'stock_data' => null];
88109
$this->session->expects($this->any())->method('getProductData')
89-
->willReturn(['product' => ['name' => 'test-name']]);
110+
->willReturn(['product' => $productData]);
90111

91-
$this->product->expects($this->once())->method('addData')->with(['name' => 'test-name', 'stock_data' => null]);
112+
$this->initializationHelper
113+
->expects($this->once())
114+
->method('initializeFromData')
115+
->with($this->product, $productData)
116+
->willReturn($this->product);
92117

93118
$this->action->execute();
94119
}

0 commit comments

Comments
 (0)