@@ -151,12 +151,69 @@ public function deleteById($sku, $id)
151
151
*/
152
152
public function save ($ sku , \Magento \ConfigurableProduct \Api \Data \OptionInterface $ option )
153
153
{
154
- /** @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute $configurableAttribute */
154
+ /** @var $configurableAttribute \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute */
155
155
$ configurableAttribute = $ this ->configurableAttributeFactory ->create ();
156
156
if ($ option ->getId ()) {
157
- $ this ->saveExistingOption ($ sku , $ option , $ configurableAttribute );
157
+ /** @var \Magento\Catalog\Model\Product $product */
158
+ $ product = $ this ->getProduct ($ sku );
159
+ $ configurableAttribute ->load ($ option ->getId ());
160
+ if (!$ configurableAttribute ->getId () || $ configurableAttribute ->getProductId () != $ product ->getId ()) {
161
+ throw new NoSuchEntityException (
162
+ __ (
163
+ 'Option with id "%1" not found ' ,
164
+ $ option ->getId ()
165
+ )
166
+ );
167
+ }
168
+ $ configurableAttribute ->addData ($ option ->getData ());
169
+ $ configurableAttribute ->setValues (
170
+ $ option ->getValues () !== null ? $ option ->getValues () : $ configurableAttribute ->getPrices ()
171
+ );
172
+
173
+ try {
174
+ $ configurableAttribute ->save ();
175
+ } catch (\Exception $ e ) {
176
+ throw new CouldNotSaveException (
177
+ __ (
178
+ 'Could not update option with id "%1" ' ,
179
+ $ option ->getId ()
180
+ )
181
+ );
182
+ }
158
183
} else {
159
- $ this ->saveNewOption ($ sku , $ option , $ configurableAttribute );
184
+ $ this ->validateNewOptionData ($ option );
185
+ /** @var \Magento\Catalog\Model\Product $product */
186
+ $ product = $ this ->productRepository ->get ($ sku );
187
+ $ allowedTypes = [ProductType::TYPE_SIMPLE , ProductType::TYPE_VIRTUAL , ConfigurableType::TYPE_CODE ];
188
+ if (!in_array ($ product ->getTypeId (), $ allowedTypes )) {
189
+ throw new \InvalidArgumentException ('Incompatible product type ' );
190
+ }
191
+
192
+ $ eavAttribute = $ this ->productAttributeRepository ->get ($ option ->getAttributeId ());
193
+ $ configurableAttribute ->loadByProductAndAttribute ($ product , $ eavAttribute );
194
+ if ($ configurableAttribute ->getId ()) {
195
+ throw new CouldNotSaveException (__ ('Product already has this option ' ));
196
+ }
197
+
198
+ $ configurableAttributesData = [
199
+ 'attribute_id ' => $ option ->getAttributeId (),
200
+ 'position ' => $ option ->getPosition (),
201
+ 'use_default ' => $ option ->getIsUseDefault (),
202
+ 'label ' => $ option ->getLabel (),
203
+ 'values ' => $ option ->getValues ()
204
+ ];
205
+
206
+ try {
207
+ $ product ->setTypeId (ConfigurableType::TYPE_CODE );
208
+ $ product ->setConfigurableAttributesData ([$ configurableAttributesData ]);
209
+ $ product ->setStoreId ($ this ->storeManager ->getStore (Store::ADMIN_CODE )->getId ());
210
+ $ product ->save ();
211
+ } catch (\Exception $ e ) {
212
+ throw new CouldNotSaveException (__ ('An error occurred while saving option ' ));
213
+ }
214
+
215
+ $ configurableAttribute = $ this ->configurableAttributeFactory ->create ();
216
+ $ configurableAttribute ->loadByProductAndAttribute ($ product , $ eavAttribute );
160
217
}
161
218
if (!$ configurableAttribute ->getId ()) {
162
219
throw new CouldNotSaveException (__ ('An error occurred while saving option ' ));
@@ -218,94 +275,4 @@ public function validateNewOptionData(\Magento\ConfigurableProduct\Api\Data\Opti
218
275
throw $ inputException ;
219
276
}
220
277
}
221
-
222
- /**
223
- * @param string $sku
224
- * @param \Magento\ConfigurableProduct\Api\Data\OptionInterface $option
225
- * @param \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute $configurableAttribute
226
- * @throws CouldNotSaveException
227
- * @throws InputException
228
- * @throws NoSuchEntityException
229
- * @return void
230
- */
231
- private function saveExistingOption (
232
- $ sku ,
233
- \Magento \ConfigurableProduct \Api \Data \OptionInterface $ option ,
234
- \Magento \ConfigurableProduct \Model \Product \Type \Configurable \Attribute $ configurableAttribute
235
- ) {
236
- /** @var \Magento\Catalog\Model\Product $product */
237
- $ product = $ this ->getProduct ($ sku );
238
- $ configurableAttribute ->load ($ option ->getId ());
239
- if (!$ configurableAttribute ->getId () || $ configurableAttribute ->getProductId () != $ product ->getId ()) {
240
- throw new NoSuchEntityException (
241
- __ (
242
- 'Option with id "%1" not found ' ,
243
- $ option ->getId ()
244
- )
245
- );
246
- }
247
- $ configurableAttribute ->addData ($ option ->getData ());
248
- $ configurableAttribute ->setValues (
249
- $ option ->getValues () !== null ? $ option ->getValues () : $ configurableAttribute ->getPrices ()
250
- );
251
-
252
- try {
253
- $ configurableAttribute ->save ();
254
- } catch (\Exception $ e ) {
255
- throw new CouldNotSaveException (
256
- __ (
257
- 'Could not update option with id "%1" ' ,
258
- $ option ->getId ()
259
- )
260
- );
261
- }
262
- }
263
-
264
- /**
265
- * @param string $sku
266
- * @param \Magento\ConfigurableProduct\Api\Data\OptionInterface $option
267
- * @param \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute $configurableAttribute
268
- * @return void
269
- * @throws CouldNotSaveException
270
- * @throws InputException
271
- */
272
- private function saveNewOption (
273
- $ sku ,
274
- \Magento \ConfigurableProduct \Api \Data \OptionInterface $ option ,
275
- \Magento \ConfigurableProduct \Model \Product \Type \Configurable \Attribute $ configurableAttribute
276
- ) {
277
- $ this ->validateNewOptionData ($ option );
278
- /** @var \Magento\Catalog\Model\Product $product */
279
- $ product = $ this ->productRepository ->get ($ sku );
280
- $ allowedTypes = [ProductType::TYPE_SIMPLE , ProductType::TYPE_VIRTUAL , ConfigurableType::TYPE_CODE ];
281
- if (!in_array ($ product ->getTypeId (), $ allowedTypes )) {
282
- throw new \InvalidArgumentException ('Incompatible product type ' );
283
- }
284
-
285
- $ eavAttribute = $ this ->productAttributeRepository ->get ($ option ->getAttributeId ());
286
- $ configurableAttribute ->loadByProductAndAttribute ($ product , $ eavAttribute );
287
- if ($ configurableAttribute ->getId ()) {
288
- throw new CouldNotSaveException (__ ('Product already has this option ' ));
289
- }
290
-
291
- $ configurableAttributesData = [
292
- 'attribute_id ' => $ option ->getAttributeId (),
293
- 'position ' => $ option ->getPosition (),
294
- 'use_default ' => $ option ->getIsUseDefault (),
295
- 'label ' => $ option ->getLabel (),
296
- 'values ' => $ option ->getValues ()
297
- ];
298
-
299
- try {
300
- $ product ->setTypeId (ConfigurableType::TYPE_CODE );
301
- $ product ->setConfigurableAttributesData ([$ configurableAttributesData ]);
302
- $ product ->setStoreId ($ this ->storeManager ->getStore (Store::ADMIN_CODE )->getId ());
303
- $ product ->save ();
304
- } catch (\Exception $ e ) {
305
- throw new CouldNotSaveException (__ ('An error occurred while saving option ' ));
306
- }
307
-
308
- $ configurableAttribute = $ this ->configurableAttributeFactory ->create ();
309
- $ configurableAttribute ->loadByProductAndAttribute ($ product , $ eavAttribute );
310
- }
311
278
}
0 commit comments