/** * Get product links list * * @param \Magento\Catalog\Api\Data\ProductInterface $product * @return \Magento\Catalog\Api\Data\ProductLinkInterface[] */ public function getList(\Magento\Catalog\Api\Data\ProductInterface $product) { $output = []; $linkTypes = $this->linkTypeProvider->getLinkTypes(); foreach (array_keys($linkTypes) as $linkTypeName) { $collection = $this->entityCollectionProvider->getCollection($product, $linkTypeName); foreach ($collection as $item) { /** @var \Magento\Catalog\Api\Data\ProductLinkInterface $productLink */ $productLink = $this->productLinkFactory->create(); $productLink->setSku($product->getSku())->setLinkType($linkTypeName)->setLinkedProductSku($item['sku'])->setLinkedProductType($item['type'])->setPosition($item['position']); if (isset($item['custom_attributes'])) { $productLinkExtension = $productLink->getExtensionAttributes(); if ($productLinkExtension === null) { $productLinkExtension = $this->productLinkExtensionFactory->create(); } foreach ($item['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); } $output[] = $productLink; } } return $output; }
/** * {@inheritdoc} */ public function delete(\Magento\Catalog\Api\Data\ProductLinkInterface $entity) { $linkedProduct = $this->productRepository->get($entity->getLinkedProductSku()); $product = $this->productRepository->get($entity->getProductSku()); $links = $this->entityCollectionProvider->getCollection($product, $entity->getLinkType()); if (!isset($links[$linkedProduct->getId()])) { throw new NoSuchEntityException(__('Product with SKU %1 is not linked to product with SKU %2', $entity->getLinkedProductSku(), $entity->getProductSku())); } //Remove product from the linked product list unset($links[$linkedProduct->getId()]); $this->linkInitializer->initializeLinks($product, [$entity->getLinkType() => $links]); try { $product->save(); } catch (\Exception $exception) { throw new CouldNotSaveException(__('Invalid data provided for linked products')); } return true; }
/** * {@inheritdoc} */ public function getLinkedItemsByType($sku, $type) { $output = []; $product = $this->productRepository->get($sku); try { $collection = $this->entityCollectionProvider->getCollection($product, $type); } catch (NoSuchEntityException $e) { throw new NoSuchEntityException(__('Unknown link type: %1', (string) $type)); } foreach ($collection as $item) { /** @var \Magento\Catalog\Api\Data\ProductLinkInterface $productLink */ $productLink = $this->productLinkFactory->create(); $productLink->setProductSku($product->getSku())->setLinkType($type)->setLinkedProductSku($item['sku'])->setLinkedProductType($item['type'])->setPosition($item['position']); if (isset($item['custom_attributes'])) { foreach ($item['custom_attributes'] as $option) { $productLink->getExtensionAttributes()->setQty($option['value']); } } $output[] = $productLink; } return $output; }