/** * Save configurable product depended data * * @param \Magento\Catalog\Model\Product $product * @return $this * @throws \InvalidArgumentException */ public function save($product) { parent::save($product); /* Save attributes information */ $data = $product->getConfigurableAttributesData(); if ($data) { foreach ($data as $attributeData) { /** @var $configurableAttribute \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute */ $configurableAttribute = $this->_configurableAttributeFactory->create(); if (!$product->getIsDuplicate()) { if (!empty($attributeData['id'])) { $configurableAttribute->load($attributeData['id']); $attributeData['attribute_id'] = $configurableAttribute->getAttributeId(); } elseif (!empty($attributeData['attribute_id'])) { $attribute = $this->_eavConfig->getAttribute(\Magento\Catalog\Model\Product::ENTITY, $attributeData['attribute_id']); $attributeData['attribute_id'] = $attribute->getId(); if (!$this->canUseAttribute($attribute)) { throw new \InvalidArgumentException('Provided attribute can not be used with configurable product'); } $configurableAttribute->loadByProductAndAttribute($product, $attribute); } } unset($attributeData['id']); $configurableAttribute->addData($attributeData)->setStoreId($product->getStoreId())->setProductId($product->getId())->save(); } /** @var $configurableAttributesCollection \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\Collection */ $configurableAttributesCollection = $this->_attributeCollectionFactory->create(); $configurableAttributesCollection->setProductFilter($product); $configurableAttributesCollection->addFieldToFilter('attribute_id', ['nin' => $this->getUsedProductAttributeIds($product)]); $configurableAttributesCollection->walk('delete'); } /* Save product relations */ $productIds = $product->getAssociatedProductIds(); if (is_array($productIds)) { $this->_typeConfigurableFactory->create()->saveProducts($product, $productIds); } return $this; }
/** * Save type related data * * @param \Magento\Catalog\Model\Product $product * @return $this */ public function save($product) { parent::save($product); $data = $product->getGroupedLinkData(); if ($data !== null) { $this->productLinks->saveGroupedLinks($product, $data); } return $this; }
/** * Save configurable product depended data * * @param \Magento\Catalog\Model\Product $product * @return $this * @throws \InvalidArgumentException * @deprecated the \Magento\ConfigurableProduct\Model\Product\SaveHandler::execute should be used instead */ public function save($product) { parent::save($product); $cacheId = __CLASS__ . $product->getId(); $this->cache->remove($cacheId); $extensionAttributes = $product->getExtensionAttributes(); // this approach is needed for 3rd-party extensions which are not using extension attributes if (empty($extensionAttributes->getConfigurableProductOptions())) { $this->saveConfigurableOptions($product); } if (empty($extensionAttributes->getConfigurableProductLinks())) { $this->saveRelatedProducts($product); } return $this; }
/** * Save type related data * * @param \Magento\Catalog\Model\Product $product * @return $this */ public function save($product) { parent::save($product); /* @var $resource \Magento\Bundle\Model\Resource\Bundle */ $resource = $this->_bundleFactory->create(); $options = $product->getBundleOptionsData(); if ($options) { $product->setIsRelationsChanged(true); foreach ($options as $key => $option) { if (isset($option['option_id']) && $option['option_id'] == '') { unset($option['option_id']); } $optionModel = $this->_bundleOption->create()->setData($option)->setParentId($product->getId())->setStoreId($product->getStoreId()); $optionModel->isDeleted((bool) $option['delete']); $optionModel->save(); $options[$key]['option_id'] = $optionModel->getOptionId(); } $usedProductIds = array(); $excludeSelectionIds = array(); $selections = $product->getBundleSelectionsData(); if ($selections) { foreach ($selections as $index => $group) { foreach ($group as $selection) { if (isset($selection['selection_id']) && $selection['selection_id'] == '') { unset($selection['selection_id']); } if (!isset($selection['is_default'])) { $selection['is_default'] = 0; } $selectionModel = $this->_bundleModelSelection->create()->setData($selection)->setOptionId($options[$index]['option_id'])->setWebsiteId($this->_storeManager->getStore($product->getStoreId())->getWebsiteId())->setParentProductId($product->getId()); $selectionModel->isDeleted((bool) $selection['delete']); $selectionModel->save(); $selection['selection_id'] = $selectionModel->getSelectionId(); if ($selectionModel->getSelectionId()) { $excludeSelectionIds[] = $selectionModel->getSelectionId(); $usedProductIds[] = $selectionModel->getProductId(); } } } $resource->dropAllUnneededSelections($product->getId(), $excludeSelectionIds); $resource->saveProductRelations($product->getId(), array_unique($usedProductIds)); } if ($product->getData('price_type') != $product->getOrigData('price_type')) { $resource->dropAllQuoteChildItems($product->getId()); } } return $this; }
/** * Save configurable product depended data * * @param \Magento\Catalog\Model\Product $product * @return $this */ public function save($product) { parent::save($product); /* Save attributes information */ $data = $product->getConfigurableAttributesData(); if ($data) { foreach ($data as $attributeData) { /** @var $configurableAttribute \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute */ $configurableAttribute = $this->_configurableAttributeFactory->create(); if (!$product->getIsDuplicate()) { if (!empty($attributeData['id'])) { $configurableAttribute->load($attributeData['id']); } else { $configurableAttribute->loadByProductAndAttribute($product, $this->getAttributeById($attributeData['attribute_id'], $product)); } } unset($attributeData['id']); $configurableAttribute->addData($attributeData)->setStoreId($product->getStoreId())->setProductId($product->getId())->save(); } /** @var $configurableAttributesCollection \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\Collection */ $configurableAttributesCollection = $this->_attributeCollectionFactory->create(); $configurableAttributesCollection->setProductFilter($product); $configurableAttributesCollection->addFieldToFilter('attribute_id', array('nin' => $this->getUsedProductAttributeIds($product))); $configurableAttributesCollection->walk('delete'); } /* Save product relations */ $productIds = $product->getAssociatedProductIds(); if (is_array($productIds)) { $this->_typeConfigurableFactory->create()->saveProducts($product, $productIds); } return $this; }
/** * Save configurable product depended data * * @param \Magento\Catalog\Model\Product $product * @return $this * @throws \InvalidArgumentException * @deprecated the \Magento\ConfigurableProduct\Model\Product\SaveHandler::execute should be used instead */ public function save($product) { parent::save($product); $metadata = $this->getMetadataPool()->getMetadata(ProductInterface::class); $cacheId = __CLASS__ . $product->getData($metadata->getLinkField()) . '_' . $product->getStoreId(); $this->cache->remove($cacheId); $extensionAttributes = $product->getExtensionAttributes(); // this approach is needed for 3rd-party extensions which are not using extension attributes if (empty($extensionAttributes->getConfigurableProductOptions())) { $this->saveConfigurableOptions($product); } if (empty($extensionAttributes->getConfigurableProductLinks())) { $this->saveRelatedProducts($product); } return $this; }