Skip to content

Commit 91074f2

Browse files
author
Michael Logvin
committed
MAGETWO-46695: Bundle ProductOptionRepositoryInterface saves option without price (price type Fixed)
1 parent e25c66b commit 91074f2

File tree

1 file changed

+98
-56
lines changed
  • app/code/Magento/Bundle/Controller/Adminhtml/Product/Initialization/Helper/Plugin

1 file changed

+98
-56
lines changed

app/code/Magento/Bundle/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Bundle.php

Lines changed: 98 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -87,73 +87,115 @@ public function afterInitialize(
8787
\Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper $subject,
8888
\Magento\Catalog\Model\Product $product
8989
) {
90-
if (($selections = $this->request->getPost('bundle_selections')) && !$product->getCompositeReadonly()) {
90+
$compositeReadonly = $product->getCompositeReadonly();
91+
$selections = $this->request->getPost('bundle_selections');
92+
if ($selections && !$compositeReadonly) {
9193
$product->setBundleSelectionsData($selections);
9294
}
93-
if (($items = $this->request->getPost('bundle_options')) && !$product->getCompositeReadonly()) {
95+
96+
$items = $this->request->getPost('bundle_options');
97+
if ($items && !$compositeReadonly) {
9498
$product->setBundleOptionsData($items);
9599
}
96100

97-
if ($product->getBundleOptionsData()) {
98-
$options = [];
99-
foreach ($product->getBundleOptionsData() as $key => $optionData) {
100-
if (!(bool)$optionData['delete']) {
101-
$option = $this->optionFactory->create(['data' => $optionData]);
102-
$option->setSku($product->getSku());
103-
$option->setOptionId(null);
104-
105-
$links = [];
106-
$bundleLinks = $product->getBundleSelectionsData();
107-
if (!empty($bundleLinks[$key])) {
108-
foreach ($bundleLinks[$key] as $linkData) {
109-
if (!(bool)$linkData['delete']) {
110-
$link = $this->linkFactory->create(['data' => $linkData]);
111-
$link->setPrice($linkData['selection_price_value']);
112-
$link->setPriceType($linkData['selection_price_type']);
113-
$linkProduct = $this->productRepository->getById($linkData['product_id']);
114-
$link->setSku($linkProduct->getSku());
115-
$link->setQty($linkData['selection_qty']);
116-
if (isset($linkData['selection_can_change_qty'])) {
117-
$link->setCanChangeQuantity($linkData['selection_can_change_qty']);
118-
}
119-
$links[] = $link;
120-
}
121-
}
122-
$option->setProductLinks($links);
123-
$options[] = $option;
124-
}
125-
}
126-
}
127-
$extension = $product->getExtensionAttributes();
128-
$extension->setBundleProductOptions($options);
129-
$product->setExtensionAttributes($extension);
101+
$this->processBundleOptionsData($product);
102+
103+
$this->processDynamicOptionsData($product);
104+
105+
$affectProductSelections = (bool)$this->request->getPost('affect_bundle_product_selections');
106+
$product->setCanSaveBundleSelections($affectProductSelections && !$compositeReadonly);
107+
return $product;
108+
}
109+
110+
/**
111+
* @param \Magento\Catalog\Model\Product $product
112+
* @return void
113+
*/
114+
protected function processBundleOptionsData(\Magento\Catalog\Model\Product $product)
115+
{
116+
$bundleOptionsData = $product->getBundleOptionsData();
117+
if (!$bundleOptionsData) {
118+
return;
130119
}
120+
$options = [];
121+
foreach ($bundleOptionsData as $key => $optionData) {
122+
if ((bool)$optionData['delete']) {
123+
continue;
124+
}
125+
$option = $this->optionFactory->create(['data' => $optionData]);
126+
$option->setSku($product->getSku());
127+
$option->setOptionId(null);
128+
129+
$links = [];
130+
$bundleLinks = $product->getBundleSelectionsData();
131+
if (empty($bundleLinks[$key])) {
132+
continue;
133+
}
134+
135+
foreach ($bundleLinks[$key] as $linkData) {
136+
if ((bool)$linkData['delete']) {
137+
continue;
138+
}
139+
$link = $this->linkFactory->create(['data' => $linkData]);
131140

132-
if (
133-
$product->getPriceType() === \Magento\Bundle\Model\Product\Price::PRICE_TYPE_DYNAMIC
134-
&& !$product->getOptionsReadonly()
135-
) {
136-
$product->setCanSaveCustomOptions(true);
137-
if ($customOptions = $product->getProductOptions()) {
138-
foreach (array_keys($customOptions) as $key) {
139-
$customOptions[$key]['is_delete'] = 1;
141+
if (array_key_exists('selection_price_value', $linkData)) {
142+
$link->setPrice($linkData['selection_price_value']);
140143
}
141-
$newOptions = $product->getOptions();
142-
foreach ($customOptions as $customOptionData) {
143-
if (!(bool)$customOptionData['is_delete']) {
144-
$customOption = $this->customOptionFactory->create(['data' => $customOptionData]);
145-
$customOption->setProductSku($product->getSku());
146-
$customOption->setOptionId(null);
147-
$newOptions[] = $customOption;
148-
}
144+
145+
if (array_key_exists('selection_price_type', $linkData)) {
146+
$link->setPriceType($linkData['selection_price_type']);
149147
}
150-
$product->setOptions($newOptions);
148+
149+
$linkProduct = $this->productRepository->getById($linkData['product_id']);
150+
$link->setSku($linkProduct->getSku());
151+
$link->setQty($linkData['selection_qty']);
152+
153+
if (array_key_exists('selection_can_change_qty', $linkData)) {
154+
$link->setCanChangeQuantity($linkData['selection_can_change_qty']);
155+
}
156+
$links[] = $link;
151157
}
158+
$option->setProductLinks($links);
159+
$options[] = $option;
152160
}
153161

154-
$product->setCanSaveBundleSelections(
155-
(bool)$this->request->getPost('affect_bundle_product_selections') && !$product->getCompositeReadonly()
156-
);
157-
return $product;
162+
$extension = $product->getExtensionAttributes();
163+
$extension->setBundleProductOptions($options);
164+
$product->setExtensionAttributes($extension);
165+
return;
166+
}
167+
168+
/**
169+
* @param \Magento\Catalog\Model\Product $product
170+
* @return void
171+
*/
172+
protected function processDynamicOptionsData(\Magento\Catalog\Model\Product $product)
173+
{
174+
if ($product->getPriceType() !== \Magento\Bundle\Model\Product\Price::PRICE_TYPE_DYNAMIC) {
175+
return;
176+
}
177+
178+
if ($product->getOptionsReadonly()) {
179+
return;
180+
}
181+
$product->setCanSaveCustomOptions(true);
182+
$customOptions = $product->getProductOptions();
183+
if (!$customOptions) {
184+
return;
185+
}
186+
foreach (array_keys($customOptions) as $key) {
187+
$customOptions[$key]['is_delete'] = 1;
188+
}
189+
$newOptions = $product->getOptions();
190+
foreach ($customOptions as $customOptionData) {
191+
if ((bool)$customOptionData['is_delete']) {
192+
continue;
193+
}
194+
$customOption = $this->customOptionFactory->create(['data' => $customOptionData]);
195+
$customOption->setProductSku($product->getSku());
196+
$customOption->setOptionId(null);
197+
$newOptions[] = $customOption;
198+
}
199+
$product->setOptions($newOptions);
158200
}
159201
}

0 commit comments

Comments
 (0)