Example #1
1
 /**
  * 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();
 }
Example #3
0
 /**
  * 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;
 }
Example #4
0
 /**
  * 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);
 }
Example #6
0
 /**
  * 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);
     }
 }
Example #7
0
 /**
  * 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);
     }
 }
Example #10
0
 /**
  * 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);
     }
 }
Example #12
0
 /**
  * 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;
 }
Example #13
0
 /**
  * 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);
 }
Example #15
0
 /**
  * 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;
 }
Example #16
0
 /**
  * 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;
 }
Example #20
0
 /**
  * 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();
 }
Example #21
0
 /**
  * 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;
 }
Example #22
0
 /**
  * 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));
     }
 }
Example #25
0
 /**
  * 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;
 }
Example #26
0
 /**
  * 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);
 }
Example #27
0
 /**
  * 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);
 }
Example #28
0
 /**
  * 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);
 }
Example #29
0
 /**
  * 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);
 }
Example #30
0
 /**
  * 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);
     }
 }