/**
  * 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;
 }
Beispiel #2
0
 /**
  * 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;
 }
Beispiel #4
0
 /**
  * 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;
 }
Beispiel #5
0
 /**
  * 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;
 }
Beispiel #6
0
 /**
  * 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;
 }