/** * @param \Magento\Catalog\Model\Product $expectedProduct * @param \Magento\Catalog\Model\Product $actualProduct */ protected function assertEqualsSpecificAttributes($expectedProduct, $actualProduct) { $expectedBundleProductOptions = $expectedProduct->getExtensionAttributes()->getBundleProductOptions(); $actualBundleProductOptions = $actualProduct->getExtensionAttributes()->getBundleProductOptions(); $this->assertEquals(count($expectedBundleProductOptions), count($actualBundleProductOptions)); $expectedBundleProductOptionsToCompare = []; foreach ($expectedBundleProductOptions as $expectedBundleProductOption) { $expectedBundleProductOptionsToCompare[$expectedBundleProductOption->getTitle()]['type'] = $expectedBundleProductOption->getType(); foreach ($expectedBundleProductOption->getProductLinks() as $productLink) { $expectedBundleProductOptionsToCompare[$expectedBundleProductOption->getTitle()]['product_links'][] = $productLink->getSku(); } } $actualBundleProductOptionsToCompare = []; foreach ($actualBundleProductOptions as $actualBundleProductOption) { $actualBundleProductOptionsToCompare[$actualBundleProductOption->getTitle()]['type'] = $actualBundleProductOption->getType(); foreach ($actualBundleProductOption->getProductLinks() as $productLink) { $actualBundleProductOptionsToCompare[$actualBundleProductOption->getTitle()]['product_links'][] = $productLink->getSku(); } } $this->assertEquals(count($expectedBundleProductOptions), count($actualBundleProductOptions)); foreach ($expectedBundleProductOptionsToCompare as $key => $expectedBundleProductOption) { $this->assertEquals($expectedBundleProductOption['type'], $actualBundleProductOptionsToCompare[$key]['type']); $expectedProductLinks = $expectedBundleProductOption['product_links']; $actualProductLinks = $actualBundleProductOptionsToCompare[$key]['product_links']; sort($expectedProductLinks); sort($actualProductLinks); $this->assertEquals($expectedProductLinks, $actualProductLinks); } }
/** * Retrieve product link by its ID (or first link if ID is not specified) * * @param Product $product * @param int|null $linkId * @return Link|null */ protected function getTargetLink(Product $product, $linkId = null) { $links = $product->getExtensionAttributes()->getDownloadableProductLinks(); if ($linkId !== null) { return isset($links[$linkId]) ? $links[$linkId] : null; } // return first link return reset($links); }
/** * Add stock item information to the product's extension attributes * * @param \Magento\Catalog\Model\Product $product * @return \Magento\Catalog\Model\Product */ public function afterLoad(\Magento\Catalog\Model\Product $product) { $productExtension = $product->getExtensionAttributes(); if ($productExtension === null) { $productExtension = $this->productExtensionFactory->create(); } // stockItem := \Magento\CatalogInventory\Api\Data\StockItemInterface $productExtension->setStockItem($this->stockRegistry->getStockItem($product->getId())); $product->setExtensionAttributes($productExtension); return $product; }
/** * 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; }
/** * @param \Magento\Catalog\Model\Product $expectedProduct * @param \Magento\Catalog\Model\Product $actualProduct */ protected function assertEqualsSpecificAttributes($expectedProduct, $actualProduct) { $expectedProductLinks = $expectedProduct->getExtensionAttributes()->getDownloadableProductLinks(); $expectedProductSamples = $expectedProduct->getExtensionAttributes()->getDownloadableProductSamples(); $actualProductLinks = $actualProduct->getExtensionAttributes()->getDownloadableProductLinks(); $actualProductSamples = $actualProduct->getExtensionAttributes()->getDownloadableProductSamples(); $this->assertEquals(count($expectedProductLinks), count($actualProductLinks)); $this->assertEquals(count($expectedProductSamples), count($actualProductSamples)); $expectedLinksArray = []; foreach ($expectedProductLinks as $link) { $expectedLinksArray[] = $link->getData(); } foreach ($actualProductLinks as $actualLink) { $this->assertContains($expectedLinksArray, $actualLink->getData()); } $expectedSamplesArray = []; foreach ($expectedProductSamples as $sample) { $expectedSamplesArray[] = $sample->getData(); } foreach ($actualProductSamples as $actualSample) { $this->assertContains($expectedSamplesArray, $actualSample->getData()); } }
/** * Retrieve product link by its ID (or first link if ID is not specified) * * @param Product $product * @param int|null $linkId * @return Link|null */ protected function getTargetLink(Product $product, $linkId = null) { $links = $product->getExtensionAttributes()->getDownloadableProductLinks(); if ($linkId !== null) { if (!empty($links)) { foreach ($links as $link) { if ($link->getId() == $linkId) { return $link; } } } return null; } // return first link return reset($links); }
/** * Retrieve product sample by its ID (or first sample if ID is not specified) * * @param Product $product * @param int|null $sampleId * @return Sample|null */ protected function getTargetSample(Product $product, $sampleId = null) { $samples = $product->getExtensionAttributes()->getDownloadableProductSamples(); if ($sampleId) { /* @var $sample \Magento\Downloadable\Model\Sample */ if ($samples) { foreach ($samples as $sample) { if ($sample->getId() == $sampleId) { return $sample; } } } return null; } // return first sample return $samples[0]; }
/** * @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; }
/** * Prepare product to save * * @param \Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper $subject * @param \Magento\Catalog\Model\Product $product * * @return \Magento\Catalog\Model\Product * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ public function afterInitialize(\Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper $subject, \Magento\Catalog\Model\Product $product) { if ($downloadable = $this->request->getPost('downloadable')) { $product->setDownloadableData($downloadable); $extension = $product->getExtensionAttributes(); if (isset($downloadable['link']) && is_array($downloadable['link'])) { $links = []; foreach ($downloadable['link'] as $linkData) { if (!$linkData || isset($linkData['is_delete']) && $linkData['is_delete']) { continue; } else { $links[] = $this->getLinkBuilder()->setData($linkData)->build($this->getLinkFactory()->create()); } } $extension->setDownloadableProductLinks($links); } if (isset($downloadable['sample']) && is_array($downloadable['sample'])) { $samples = []; foreach ($downloadable['sample'] as $sampleData) { if (!$sampleData || isset($sampleData['is_delete']) && (bool) $sampleData['is_delete']) { continue; } else { $samples[] = $this->getSampleBuilder()->setData($sampleData)->build($this->getSampleFactory()->create()); } } $extension->setDownloadableProductSamples($samples); } $product->setExtensionAttributes($extension); if ($product->getLinksPurchasedSeparately()) { $product->setTypeHasRequiredOptions(true)->setRequiredOptions(true); } else { $product->setTypeHasRequiredOptions(false)->setRequiredOptions(false); } } return $product; }
/** * @param \Magento\Catalog\Model\Product $product * @return void * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ protected function processBundleOptionsData(\Magento\Catalog\Model\Product $product) { $bundleOptionsData = $product->getBundleOptionsData(); if (!$bundleOptionsData) { return; } $options = []; foreach ($bundleOptionsData as $key => $optionData) { if ((bool) $optionData['delete']) { continue; } $option = $this->optionFactory->create(['data' => $optionData]); $option->setSku($product->getSku()); $option->setOptionId(null); $links = []; $bundleLinks = $product->getBundleSelectionsData(); if (empty($bundleLinks[$key])) { continue; } foreach ($bundleLinks[$key] as $linkData) { if ((bool) $linkData['delete']) { continue; } $link = $this->linkFactory->create(['data' => $linkData]); if ((int) $product->getPriceType() !== \Magento\Bundle\Model\Product\Price::PRICE_TYPE_DYNAMIC) { if (array_key_exists('selection_price_value', $linkData)) { $link->setPrice($linkData['selection_price_value']); } if (array_key_exists('selection_price_type', $linkData)) { $link->setPriceType($linkData['selection_price_type']); } } $linkProduct = $this->productRepository->getById($linkData['product_id']); $link->setSku($linkProduct->getSku()); $link->setQty($linkData['selection_qty']); if (array_key_exists('selection_can_change_qty', $linkData)) { $link->setCanChangeQuantity($linkData['selection_can_change_qty']); } $links[] = $link; } $option->setProductLinks($links); $options[] = $option; } $extension = $product->getExtensionAttributes(); $extension->setBundleProductOptions($options); $product->setExtensionAttributes($extension); return; }
/** * {@inheritdoc} */ public function getExtensionAttributes() { $pluginInfo = $this->pluginList->getNext($this->subjectType, 'getExtensionAttributes'); if (!$pluginInfo) { return parent::getExtensionAttributes(); } else { return $this->___callPlugins('getExtensionAttributes', func_get_args(), $pluginInfo); } }
/** * Prepare product to save * * @param \Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper $subject * @param \Magento\Catalog\Model\Product $product * * @return \Magento\Catalog\Model\Product * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ public function afterInitialize(\Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper $subject, \Magento\Catalog\Model\Product $product) { if ($downloadable = $this->request->getPost('downloadable')) { $product->setDownloadableData($downloadable); $extension = $product->getExtensionAttributes(); if (isset($downloadable['link']) && is_array($downloadable['link'])) { $links = []; foreach ($downloadable['link'] as $linkData) { if (!$linkData || isset($linkData['is_delete']) && (bool) $linkData['is_delete']) { continue; } else { unset($linkData['link_id']); // TODO: need to implement setLinkFileContent() $link = $this->linkFactory->create(['data' => $linkData]); if (isset($linkData['type'])) { $link->setLinkType($linkData['type']); } if (isset($linkData['file'])) { $link->setLinkFile($linkData['file']); } if (isset($linkData['file_content'])) { $link->setLinkFileContent($linkData['file_content']); } $link->setId(null); if (isset($linkData['sample']['type'])) { $link->setSampleType($linkData['sample']['type']); } if (isset($linkData['sample']['file'])) { $link->setSampleFile($linkData['sample']['file']); } if (isset($linkData['sample']['url'])) { $link->setSampleUrl($linkData['sample']['url']); } if (isset($linkData['sample']['file_content'])) { $link->setSampleFileContent($linkData['file_content']); } $link->setStoreId($product->getStoreId()); $link->setWebsiteId($product->getStore()->getWebsiteId()); $link->setProductWebsiteIds($product->getWebsiteIds()); if (!$link->getSortOrder()) { $link->setSortOrder(1); } if (null === $link->getPrice()) { $link->setPrice(0); } if ($link->getIsUnlimited()) { $link->setNumberOfDownloads(0); } $links[] = $link; } } $extension->setDownloadableProductLinks($links); } if (isset($downloadable['sample']) && is_array($downloadable['sample'])) { $samples = []; foreach ($downloadable['sample'] as $sampleData) { if (!$sampleData || isset($sampleData['is_delete']) && (bool) $sampleData['is_delete']) { continue; } else { unset($sampleData['sample_id']); $sample = $this->sampleFactory->create(['data' => $sampleData]); $sample->setId(null); $sample->setStoreId($product->getStoreId()); if (isset($sampleData['type'])) { $sample->setSampleType($sampleData['type']); } if (isset($sampleData['sample_url'])) { $sample->setSampleUrl($sampleData['sample_url']); } if (!$sample->getSortOrder()) { $sample->setSortOrder(1); } $samples[] = $sample; } } $extension->setDownloadableProductSamples($samples); } $product->setExtensionAttributes($extension); if ($product->getLinksPurchasedSeparately()) { $product->setTypeHasRequiredOptions(true)->setRequiredOptions(true); } else { $product->setTypeHasRequiredOptions(false)->setRequiredOptions(false); } } return $product; }