/** * Check whether Msrp applied to product Product Type * * @param \Magento\Catalog\Model\Product $product * @return bool * @api */ public function canApplyToProduct($product) { if ($this->mapApplyToProductType === null) { /** @var $attribute \Magento\Catalog\Model\ResourceModel\Eav\Attribute */ $attribute = $this->eavAttributeFactory->create()->loadByCode(Product::ENTITY, 'msrp'); $this->mapApplyToProductType = $attribute->getApplyTo(); } return in_array($product->getTypeId(), $this->mapApplyToProductType); }
/** * Regular catalog price * * @param \Magento\Catalog\Model\Product $product * @return float * @throws \UnexpectedValueException */ public function getCatalogRegularPrice(\Magento\Catalog\Model\Product $product) { if (array_key_exists($product->getTypeId(), $this->priceModelPool)) { $catalogPriceModel = $this->priceModelFactory->create($this->priceModelPool[$product->getTypeId()]); return $catalogPriceModel->getCatalogRegularPrice($product); } return $product->getPrice(); }
/** * Unset swatch image role if product is not simple * * @param \Magento\Catalog\Model\Product $product * @param array|string $imageRoles * @return array */ public function afterGetMediaAttributes(\Magento\Catalog\Model\Product $product, $imageRoles) { if ($product->getTypeId() !== \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE && $product->getTypeId() !== \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL) { if (is_array($imageRoles)) { unset($imageRoles[\Magento\Swatches\Model\Swatch::SWATCH_IMAGE_NAME]); } } return $imageRoles; }
/** * Decide whether product has been configured for cart or not * * @param \Magento\Catalog\Model\Product\CartConfiguration $subject * @param callable $proceed * @param \Magento\Catalog\Model\Product $product * @param array $config * * @return bool * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function aroundIsProductConfigured(\Magento\Catalog\Model\Product\CartConfiguration $subject, \Closure $proceed, \Magento\Catalog\Model\Product $product, $config) { if ($product->getTypeId() == \Magento\GroupedProduct\Model\Product\Type\Grouped::TYPE_CODE) { return isset($config['super_group']); } return $proceed($product, $config); }
/** * Decide whether product has been configured for cart or not * * @param \Magento\Catalog\Model\Product\CartConfiguration $subject * @param callable $proceed * @param \Magento\Catalog\Model\Product $product * @param array $config * * @return bool * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function aroundIsProductConfigured(\Magento\Catalog\Model\Product\CartConfiguration $subject, \Closure $proceed, \Magento\Catalog\Model\Product $product, $config) { if ($product->getTypeId() == \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE) { return isset($config['links']); } return $proceed($product, $config); }
/** * Initialize grouped product links * * @param \Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks $subject * @param \Magento\Catalog\Model\Product $product * @param array $links * * @return \Magento\Catalog\Model\Product * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function beforeInitializeLinks(\Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks $subject, \Magento\Catalog\Model\Product $product, array $links) { if ($product->getTypeId() == TypeGrouped::TYPE_CODE && !$product->getGroupedReadonly()) { $links = isset($links['associated']) ? $links['associated'] : $product->getGroupedLinkData(); $product->setGroupedLinkData((array) $links); } }
/** * Returns helper for product type * * @param Product $product * @return \Magento\Catalog\Helper\Product\Configuration\ConfigurationInterface */ protected function _getProductHelper($product) { // Retrieve whole array of renderers $productHelpers = $this->getProductHelpers(); if (!is_array($productHelpers)) { $column = $this->getColumn(); if ($column) { $grid = $column->getGrid(); if ($grid) { $productHelpers = $grid->getProductConfigurationHelpers(); $this->setProductHelpers($productHelpers ? $productHelpers : []); } } } // Check whether we have helper for our product $productType = $product->getTypeId(); if (isset($productHelpers[$productType])) { $helperName = $productHelpers[$productType]; } elseif (isset($productHelpers['default'])) { $helperName = $productHelpers['default']; } else { $helperName = 'Magento\\Catalog\\Helper\\Product\\Configuration'; } return $this->_productConfigPool->get($helperName); }
/** * @param \Magento\Catalog\Model\Product\Attribute\Backend\Price $subject * @param \Closure $proceed * @param \Magento\Catalog\Model\Product|\Magento\Framework\Object $object * @return bool * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function aroundValidate(\Magento\Catalog\Model\Product\Attribute\Backend\Price $subject, \Closure $proceed, $object) { if ($object instanceof \Magento\Catalog\Model\Product && $object->getTypeId() == \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE && $object->getPriceType() == \Magento\Bundle\Model\Product\Price::PRICE_TYPE_DYNAMIC) { return true; } else { return $proceed($object); } }
/** * Process given product and change its type if needed * * @param \Magento\Catalog\Model\Product $product * @return void */ public function processProduct(Product $product) { if (in_array($product->getTypeId(), $this->compatibleTypes)) { $product->setTypeInstance(null); $productTypeId = $this->weightResolver->resolveProductHasWeight($product) ? Type::TYPE_SIMPLE : Type::TYPE_VIRTUAL; $product->setTypeId($productTypeId); } }
/** * Process given product and change its type if needed * * @param \Magento\Catalog\Model\Product $product * @return void */ public function processProduct(Product $product) { if (in_array($product->getTypeId(), $this->compatibleTypes)) { $product->setTypeInstance(null); $productTypeId = $product->hasIsVirtual() ? \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL : \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE; $product->setTypeId($productTypeId); } }
/** * @param \Magento\Catalog\Model\Product\Attribute\Backend\Price $subject * @param \Closure $proceed * @param \Magento\Catalog\Model\Product|\Magento\Framework\DataObject $object * @return bool * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function aroundValidate(\Magento\Catalog\Model\Product\Attribute\Backend\Price $subject, \Closure $proceed, $object) { if ($object instanceof \Magento\Catalog\Model\Product && $object->getTypeId() == Configurable::TYPE_CODE) { return true; } else { return $proceed($object); } }
/** * Check if quantity can be displayed for tier price with msrp * * @param Product $product * @return bool * @SuppressWarnings(PHPMD.BooleanGetMethodName) */ public function getCanDisplayQty(Product $product) { //TODO Refactor - change to const similar to Model\Product\Type\Grouped::TYPE_CODE if ($product->getTypeId() == 'grouped') { return false; } return true; }
/** * Change product type to downloadable if needed * * @param \Magento\Catalog\Model\Product\TypeTransitionManager $subject * @param Closure $proceed * @param \Magento\Catalog\Model\Product $product * @return void * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function aroundProcessProduct(\Magento\Catalog\Model\Product\TypeTransitionManager $subject, Closure $proceed, \Magento\Catalog\Model\Product $product) { $isTypeCompatible = in_array($product->getTypeId(), array(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE, \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL, \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE)); $hasDownloadableData = $this->request->getPost('downloadable'); if ($isTypeCompatible && $hasDownloadableData && $product->hasIsVirtual()) { $product->setTypeId(\Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE); return; } $proceed($product); }
public function testGetFinalPrice() { $finalPrice = 11; $qty = 1; $this->model->setQty($qty); $productTypePriceMock = $this->getMock('Magento\\Catalog\\Model\\Product\\Type\\Price', ['getFinalPrice'], [], '', false); $productTypePriceMock->expects($this->any())->method('getFinalPrice')->with($qty, $this->model)->will($this->returnValue($finalPrice)); $this->productTypeInstanceMock->expects($this->any())->method('priceFactory')->with($this->model->getTypeId())->will($this->returnValue($productTypePriceMock)); $this->assertEquals($finalPrice, $this->model->getFinalPrice($qty)); $this->model->setFinalPrice(9.99); }
/** * Decide whether product has been configured for cart or not * * @param \Magento\Catalog\Model\Product $product * @param array $config * @return bool */ public function isProductConfigured(\Magento\Catalog\Model\Product $product, $config) { // If below POST fields were submitted - this is product's options, it has been already configured switch ($product->getTypeId()) { case \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE: case \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL: return isset($config['options']); case \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE: return isset($config['bundle_option']); } return false; }
/** * Load specific layout handles by product type id * * @param CatalogProduct $product * @return \Magento\Framework\View\Result\Page */ protected function getProductPage($product) { /** @var \Magento\Framework\View\Result\Page $resultPage */ $resultPage = $this->resultFactory->create(ResultFactory::TYPE_PAGE); if ($product->getPageLayout()) { $resultPage->getConfig()->setPageLayout($product->getPageLayout()); } $urlSafeSku = rawurlencode($product->getSku()); $resultPage->addPageLayoutHandles(['id' => $product->getId(), 'sku' => $urlSafeSku, 'type' => $product->getTypeId()]); $resultPage->addUpdate($product->getCustomLayoutUpdate()); return $resultPage; }
/** * Replace original configurable product with first child * * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @param \Magento\Catalog\Block\Product\AbstractProduct $subject * @param \Magento\Catalog\Model\Product $product * @param string $location * @param array $attributes * @return array */ public function beforeGetImage(\Magento\Catalog\Block\Product\AbstractProduct $subject, \Magento\Catalog\Model\Product $product, $location, array $attributes = []) { if ($product->getTypeId() == \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE && ($location == self::CATEGORY_PAGE_GRID_LOCATION || $location == self::CATEGORY_PAGE_LIST_LOCATION)) { $request = $this->request->getParams(); if (is_array($request)) { $filterArray = $this->getFilterArray($request); if (!empty($filterArray)) { $product = $this->loadSimpleVariation($product, $filterArray); } } } return [$product, $location, $attributes]; }
/** * Duplicating bundle options and selections * * @param Product $product * @param Product $duplicate * @return void */ public function build(Product $product, Product $duplicate) { if ($product->getTypeId() != Type::TYPE_BUNDLE) { //do nothing if not bundle return; } $bundleOptions = $product->getExtensionAttributes()->getBundleProductOptions(); $duplicatedBundleOptions = []; foreach ($bundleOptions as $key => $bundleOption) { $duplicatedBundleOptions[$key] = clone $bundleOption; } $duplicate->getExtensionAttributes()->setBundleProductOptions($duplicatedBundleOptions); }
/** * @param \Magento\Catalog\Model\Product $product * @return \Magento\Catalog\Model\Product */ public function afterLoad(\Magento\Catalog\Model\Product $product) { if ($product->getTypeId() != \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE) { return $product; } $productExtension = $product->getExtensionAttributes(); if ($productExtension === null) { $productExtension = $this->productExtensionFactory->create(); } $productExtension->setConfigurableProductOptions($this->getOptions($product)); $productExtension->setConfigurableProductLinks($this->getLinkedProducts($product)); $product->setExtensionAttributes($productExtension); return $product; }
/** * Load specific layout handles by product type id * * @param CatalogProduct $product * @return void */ protected function _initProductLayout($product) { $this->_view->getPage()->initLayout(); if ($product->getPageLayout()) { /** @var \Magento\Framework\View\Page\Config $pageConfig */ $pageConfig = $this->_objectManager->get('Magento\\Framework\\View\\Page\\Config'); $pageConfig->setPageLayout($product->getPageLayout()); } $update = $this->_view->getLayout()->getUpdate(); $this->_view->addPageLayoutHandles(array('id' => $product->getId(), 'sku' => $product->getSku(), 'type' => $product->getTypeId())); $this->_view->loadLayoutUpdates(); $update->addUpdate($product->getCustomLayoutUpdate()); $this->_view->generateLayoutXml(); $this->_view->generateLayoutBlocks(); }
/** * Disable MAP if it's bundle with dynamic price type * * @param \Magento\Catalog\Model\Product $product * @return $this */ public function beforeSave($product) { if (!$product instanceof \Magento\Catalog\Model\Product || $product->getTypeId() != \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE || $product->getPriceType() != \Magento\Bundle\Model\Product\Price::PRICE_TYPE_DYNAMIC) { return parent::beforeSave($product); } parent::beforeSave($product); $attributeCode = $this->getAttribute()->getName(); $value = $product->getData($attributeCode); if (empty($value)) { $value = $this->_catalogData->isMsrpApplyToAll(); } if ($value) { $product->setData($attributeCode, 0); } return $this; }
/** * Load specific layout handles by product type id * * @param CatalogProduct $product * @return void */ protected function _initProductLayout($product) { $update = $this->_view->getLayout()->getUpdate(); $update->addHandle('default'); $this->_view->addPageLayoutHandles(array('id' => $product->getId(), 'sku' => $product->getSku(), 'type' => $product->getTypeId())); if ($product->getPageLayout()) { $this->_objectManager->get('Magento\\Theme\\Helper\\Layout')->applyHandle($product->getPageLayout()); } $this->_view->loadLayoutUpdates(); if ($product->getPageLayout()) { $this->_objectManager->get('Magento\\Theme\\Helper\\Layout')->applyTemplate($product->getPageLayout()); } $update->addUpdate($product->getCustomLayoutUpdate()); $this->_view->generateLayoutXml(); $this->_view->generateLayoutBlocks(); }
/** * @param \Magento\Catalog\Model\Product $product * @return \Magento\Catalog\Model\Product */ public function afterLoad(\Magento\Catalog\Model\Product $product) { if ($product->getTypeId() != \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE) { return $product; } $productExtension = $product->getExtensionAttributes() ?: $this->productExtensionFactory->create(); $links = $this->linkRepository->getLinksByProduct($product); if ($links !== null) { $productExtension->setDownloadableProductLinks($links); } $samples = $this->sampleRepository->getSamplesByProduct($product); if ($samples !== null) { $productExtension->setDownloadableProductSamples($samples); } $product->setExtensionAttributes($productExtension); return $product; }
/** * Initialize grouped product links * * @param \Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks $subject * @param \Magento\Catalog\Model\Product $product * @param array $links * * @return \Magento\Catalog\Model\Product * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ public function beforeInitializeLinks(\Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks $subject, \Magento\Catalog\Model\Product $product, array $links) { if ($product->getTypeId() === TypeGrouped::TYPE_CODE && !$product->getGroupedReadonly()) { $links = isset($links[self::TYPE_NAME]) ? $links[self::TYPE_NAME] : $product->getGroupedLinkData(); if (!is_array($links)) { $links = []; } if ($product->getGroupedLinkData()) { $links = array_merge($links, $product->getGroupedLinkData()); } $newLinks = []; $existingLinks = $product->getProductLinks(); foreach ($links as $linkRaw) { /** @var \Magento\Catalog\Api\Data\ProductLinkInterface $productLink */ $productLink = $this->productLinkFactory->create(); if (!isset($linkRaw['id'])) { continue; } $productId = $linkRaw['id']; if (!isset($linkRaw['qty'])) { $linkRaw['qty'] = 0; } $linkedProduct = $this->productRepository->getById($productId); $productLink->setSku($product->getSku())->setLinkType(self::TYPE_NAME)->setLinkedProductSku($linkedProduct->getSku())->setLinkedProductType($linkedProduct->getTypeId())->setPosition($linkRaw['position'])->getExtensionAttributes()->setQty($linkRaw['qty']); if (isset($linkRaw['custom_attributes'])) { $productLinkExtension = $productLink->getExtensionAttributes(); if ($productLinkExtension === null) { $productLinkExtension = $this->productLinkExtensionFactory->create(); } foreach ($linkRaw['custom_attributes'] as $option) { $name = $option['attribute_code']; $value = $option['value']; $setterName = 'set' . ucfirst($name); // Check if setter exists if (method_exists($productLinkExtension, $setterName)) { call_user_func([$productLinkExtension, $setterName], $value); } } $productLink->setExtensionAttributes($productLinkExtension); } $newLinks[] = $productLink; } $existingLinks = $this->removeUnExistingLinks($existingLinks, $newLinks); $product->setProductLinks(array_merge($existingLinks, $newLinks)); } }
/** * Initialize data for configurable product * * @param \Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper $subject * @param \Magento\Catalog\Model\Product $product * * @return \Magento\Catalog\Model\Product * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function afterInitialize(\Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper $subject, \Magento\Catalog\Model\Product $product) { $attributes = $this->request->getParam('attributes'); if ($product->getTypeId() == ConfigurableProduct::TYPE_CODE && !empty($attributes)) { $setId = $this->request->getPost('new-variations-attribute-set-id'); $product->setAttributeSetId($setId); $this->productType->setUsedProductAttributeIds($attributes, $product); $product->setNewVariationsAttributeSetId($setId); $associatedProductIds = $this->request->getPost('associated_product_ids', []); $variationsMatrix = $this->request->getParam('variations-matrix', []); if (!empty($variationsMatrix)) { $generatedProductIds = $this->variationHandler->generateSimpleProducts($product, $variationsMatrix); $associatedProductIds = array_merge($associatedProductIds, $generatedProductIds); } $product->setAssociatedProductIds(array_filter($associatedProductIds)); $product->setCanSaveConfigurableAttributes((bool) $this->request->getPost('affect_configurable_product_attributes')); } return $product; }
/** * Duplicating downloadable product data * * @param \Magento\Catalog\Model\Product $product * @param \Magento\Catalog\Model\Product $duplicate * @return void */ public function build(\Magento\Catalog\Model\Product $product, \Magento\Catalog\Model\Product $duplicate) { if ($product->getTypeId() !== \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE) { //do nothing if not downloadable return; } $data = array(); /** @var \Magento\Downloadable\Model\Product\Type $type */ $type = $product->getTypeInstance(); foreach ($type->getLinks($product) as $link) { /* @var \Magento\Downloadable\Model\Link $link */ $linkData = $link->getData(); $data['link'][] = array('is_delete' => false, 'link_id' => null, 'title' => $linkData['title'], 'is_shareable' => $linkData['is_shareable'], 'sample' => array('type' => $linkData['sample_type'], 'url' => $linkData['sample_url'], 'file' => $this->encoder->jsonEncode(array(array('file' => $linkData['sample_file'], 'name' => $linkData['sample_file'], 'size' => 0, 'status' => null)))), 'file' => $this->encoder->jsonEncode(array(array('file' => $linkData['link_file'], 'name' => $linkData['link_file'], 'size' => 0, 'status' => null))), 'type' => $linkData['link_type'], 'link_url' => $linkData['link_url'], 'sort_order' => $linkData['sort_order'], 'number_of_downloads' => $linkData['number_of_downloads'], 'price' => $linkData['price']); } /** @var \Magento\Downloadable\Model\Sample $sample */ foreach ($type->getSamples($product) as $sample) { $sampleData = $sample->getData(); $data['sample'][] = array('is_delete' => false, 'sample_id' => null, 'title' => $sampleData['title'], 'type' => $sampleData['sample_type'], 'file' => $this->encoder->jsonEncode(array(array('file' => $sampleData['sample_file'], 'name' => $sampleData['sample_file'], 'size' => 0, 'status' => null))), 'sample_url' => $sampleData['sample_url'], 'sort_order' => $sampleData['sort_order']); } $duplicate->setDownloadableData($data); }
/** * Change product type to downloadable if needed * * @param \Magento\Catalog\Model\Product\TypeTransitionManager $subject * @param Closure $proceed * @param \Magento\Catalog\Model\Product $product * @return void * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function aroundProcessProduct(\Magento\Catalog\Model\Product\TypeTransitionManager $subject, Closure $proceed, \Magento\Catalog\Model\Product $product) { $isTypeCompatible = in_array($product->getTypeId(), [\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE, \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL, \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE]); $downloadableData = $this->request->getPost('downloadable'); $hasDownloadableData = false; if (isset($downloadableData)) { foreach ($downloadableData as $data) { foreach ($data as $rowData) { if (empty($rowData['is_delete'])) { $hasDownloadableData = true; break; } } } } if ($isTypeCompatible && $hasDownloadableData && $product->hasIsVirtual()) { $product->setTypeId(\Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE); return; } $proceed($product); }
/** * Build product links * * @param \Magento\Catalog\Model\Product $product * @param \Magento\Catalog\Model\Product $duplicate * @return void */ public function build(\Magento\Catalog\Model\Product $product, \Magento\Catalog\Model\Product $duplicate) { if ($product->getTypeId() !== \Magento\GroupedProduct\Model\Product\Type\Grouped::TYPE_CODE) { //do nothing if not grouped product return; } $data = []; $attributes = []; $link = $product->getLinkInstance(); $link->setLinkTypeId(\Magento\GroupedProduct\Model\ResourceModel\Product\Link::LINK_TYPE_GROUPED); foreach ($link->getAttributes() as $attribute) { if (isset($attribute['code'])) { $attributes[] = $attribute['code']; } } /** @var \Magento\Catalog\Model\Product\Link $link */ foreach ($this->_getGroupedLinkCollection($product) as $link) { $data[$link->getLinkedProductId()] = $link->toArray($attributes); } $duplicate->setGroupedLinkData($data); }
/** * Duplicating bundle options and selections * * @param \Magento\Catalog\Model\Product $product * @param \Magento\Catalog\Model\Product $duplicate * @return void */ public function build(\Magento\Catalog\Model\Product $product, \Magento\Catalog\Model\Product $duplicate) { if ($product->getTypeId() != \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE) { //do nothing if not bundle return; } $product->getTypeInstance()->setStoreFilter($product->getStoreId(), $product); $optionCollection = $product->getTypeInstance()->getOptionsCollection($product); $selectionCollection = $product->getTypeInstance()->getSelectionsCollection($product->getTypeInstance()->getOptionsIds($product), $product); $optionCollection->appendSelections($selectionCollection); $optionRawData = array(); $selectionRawData = array(); $i = 0; foreach ($optionCollection as $option) { $optionRawData[$i] = array('required' => $option->getData('required'), 'position' => $option->getData('position'), 'type' => $option->getData('type'), 'title' => $option->getData('title') ? $option->getData('title') : $option->getData('default_title'), 'delete' => ''); foreach ($option->getSelections() as $selection) { $selectionRawData[$i][] = array('product_id' => $selection->getProductId(), 'position' => $selection->getPosition(), 'is_default' => $selection->getIsDefault(), 'selection_price_type' => $selection->getSelectionPriceType(), 'selection_price_value' => $selection->getSelectionPriceValue(), 'selection_qty' => $selection->getSelectionQty(), 'selection_can_change_qty' => $selection->getSelectionCanChangeQty(), 'delete' => ''); } $i++; } $duplicate->setBundleOptionsData($optionRawData); $duplicate->setBundleSelectionsData($selectionRawData); }
/** * Handle data received from Associated Products tab of configurable product * * @param Product $product * @return void */ public function handle(Product $product) { if ($product->getTypeId() != \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE) { return; } /** @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable $type */ $type = $product->getTypeInstance(); $originalAttributes = $type->getConfigurableAttributesAsArray($product); // Organize main information about original product attributes in assoc array form $originalAttributesMainInfo = []; if (is_array($originalAttributes)) { foreach ($originalAttributes as $originalAttribute) { $originalAttributesMainInfo[$originalAttribute['id']] = []; foreach ($originalAttribute['values'] as $value) { $originalAttributesMainInfo[$originalAttribute['id']][$value['value_index']] = ['is_percent' => $value['is_percent'], 'pricing_value' => $value['pricing_value']]; } } } $attributeData = $product->getConfigurableAttributesData(); if (is_array($attributeData)) { foreach ($attributeData as &$data) { $id = $data['attribute_id']; foreach ($data['values'] as &$value) { $valueIndex = $value['value_index']; if (isset($originalAttributesMainInfo[$id][$valueIndex])) { $value['pricing_value'] = $originalAttributesMainInfo[$id][$valueIndex]['pricing_value']; $value['is_percent'] = $originalAttributesMainInfo[$id][$valueIndex]['is_percent']; } else { $value['pricing_value'] = 0; $value['is_percent'] = 0; } } } $product->setConfigurableAttributesData($attributeData); } }