/** * Test for setProductLinks() */ public function testSetProductLinks() { $link = $this->objectManagerHelper->getObject('Magento\\Catalog\\Model\\ProductLink\\Link'); $link->setSku("Simple Product 1"); $link->setLinkType("upsell"); $link->setLinkedProductSku("Simple Product 2"); $link->setLinkedProductType("simple"); $link->setPosition(0); $productLinks = [$link]; $this->model->setProductLinks($productLinks); $this->assertEquals($productLinks, $this->model->getProductLinks()); }
/** * 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)); } }
/** * @param \Magento\Catalog\Model\Product $entity * @return array */ public function convertLinksToGroupedArray($entity) { $basicData = $entity->getProductLinks(); $associatedProducts = $entity->getTypeInstance()->getAssociatedProducts($entity); $associatedProducts = $this->indexBySku($associatedProducts); $linksAsArray = []; /** @var \Magento\Catalog\Api\Data\ProductLinkInterface $link */ foreach ($basicData as $link) { $info = $link->getData(); if ($link->getLinkType() == 'associated') { $info['id'] = $associatedProducts[$link->getLinkedProductSku()]->getId(); } $info = array_merge($info, $link->getExtensionAttributes()->__toArray()); $linksAsArray[$link->getLinkType()][] = $info; } return $linksAsArray; }
/** * Test for getProductLinks() with associated product links */ public function testGetProductLinks() { $this->markTestIncomplete('Skipped due to https://jira.corp.x.com/browse/MAGETWO-36926'); $linkTypes = ['related' => 1, 'upsell' => 4, 'crosssell' => 5, 'associated' => 3]; $this->linkTypeProviderMock->expects($this->once())->method('getLinkTypes')->willReturn($linkTypes); $inputRelatedLink = $this->objectManagerHelper->getObject('Magento\\Catalog\\Model\\ProductLink\\Link'); $inputRelatedLink->setProductSku("Simple Product 1"); $inputRelatedLink->setLinkType("related"); $inputRelatedLink->setData("sku", "Simple Product 2"); $inputRelatedLink->setData("type", "simple"); $inputRelatedLink->setPosition(0); $customData = ["attribute_code" => "qty", "value" => 1]; $inputGroupLink = $this->objectManagerHelper->getObject('Magento\\Catalog\\Model\\ProductLink\\Link'); $inputGroupLink->setProductSku("Simple Product 1"); $inputGroupLink->setLinkType("associated"); $inputGroupLink->setData("sku", "Simple Product 2"); $inputGroupLink->setData("type", "simple"); $inputGroupLink->setPosition(0); $inputGroupLink["custom_attributes"] = [$customData]; $outputRelatedLink = $this->objectManagerHelper->getObject('Magento\\Catalog\\Model\\ProductLink\\Link'); $outputRelatedLink->setProductSku("Simple Product 1"); $outputRelatedLink->setLinkType("related"); $outputRelatedLink->setLinkedProductSku("Simple Product 2"); $outputRelatedLink->setLinkedProductType("simple"); $outputRelatedLink->setPosition(0); $groupExtension = $this->objectManagerHelper->getObject('Magento\\Catalog\\Api\\Data\\ProductLinkExtension'); $reflectionOfExtension = new \ReflectionClass('Magento\\Catalog\\Api\\Data\\ProductLinkExtension'); $method = $reflectionOfExtension->getMethod('setData'); $method->setAccessible(true); $method->invokeArgs($groupExtension, array('qty', 1)); $outputGroupLink = $this->objectManagerHelper->getObject('Magento\\Catalog\\Model\\ProductLink\\Link'); $outputGroupLink->setProductSku("Simple Product 1"); $outputGroupLink->setLinkType("associated"); $outputGroupLink->setLinkedProductSku("Simple Product 2"); $outputGroupLink->setLinkedProductType("simple"); $outputGroupLink->setPosition(0); $outputGroupLink->setExtensionAttributes($groupExtension); $this->entityCollectionProviderMock->expects($this->at(0))->method('getCollection')->with($this->model, 'related')->willReturn([$inputRelatedLink]); $this->entityCollectionProviderMock->expects($this->at(1))->method('getCollection')->with($this->model, 'upsell')->willReturn([]); $this->entityCollectionProviderMock->expects($this->at(2))->method('getCollection')->with($this->model, 'crosssell')->willReturn([]); $this->entityCollectionProviderMock->expects($this->at(3))->method('getCollection')->with($this->model, 'associated')->willReturn([$inputGroupLink]); $expectedOutput = [$outputRelatedLink, $outputGroupLink]; $typeInstanceMock = $this->getMock('Magento\\ConfigurableProduct\\Model\\Product\\Type\\Simple', ["getSku"], [], '', false); $typeInstanceMock->expects($this->atLeastOnce())->method('getSku')->willReturn("Simple Product 1"); $this->model->setTypeInstance($typeInstanceMock); $productLink1 = $this->objectManagerHelper->getObject('Magento\\Catalog\\Model\\ProductLink\\Link'); $productLink2 = $this->objectManagerHelper->getObject('Magento\\Catalog\\Model\\ProductLink\\Link'); $this->productLinkFactory->expects($this->at(0))->method('create')->willReturn($productLink1); $this->productLinkFactory->expects($this->at(1))->method('create')->willReturn($productLink2); $extension = $this->objectManagerHelper->getObject('Magento\\Catalog\\Api\\Data\\ProductLinkExtension'); $productLink2->setExtensionAttributes($extension); $links = $this->model->getProductLinks(); // Match the links $matches = 0; foreach ($links as $link) { foreach ($expectedOutput as $expected) { if ($expected->getData() == $link->getData()) { $matches++; } } } $this->assertEquals($matches, 2); }
/** * {@inheritdoc} */ public function getProductLinks() { $pluginInfo = $this->pluginList->getNext($this->subjectType, 'getProductLinks'); if (!$pluginInfo) { return parent::getProductLinks(); } else { return $this->___callPlugins('getProductLinks', func_get_args(), $pluginInfo); } }