/** * Process product links, creating new links, updating and deleting existing links * * @param \Magento\Catalog\Api\Data\ProductInterface $product * @param \Magento\Catalog\Api\Data\ProductLinkInterface[] $newLinks * @return $this * @throws NoSuchEntityException */ private function processLinks(\Magento\Catalog\Api\Data\ProductInterface $product, $newLinks) { if ($newLinks === null) { // If product links were not specified, don't do anything return $this; } // Clear all existing product links and then set the ones we want $linkTypes = $this->linkTypeProvider->getLinkTypes(); foreach (array_keys($linkTypes) as $typeName) { $this->linkInitializer->initializeLinks($product, [$typeName => []]); } // Set each linktype info if (!empty($newLinks)) { $productLinks = []; foreach ($newLinks as $link) { $productLinks[$link->getLinkType()][] = $link; } foreach ($productLinks as $type => $linksByType) { $assignedSkuList = []; /** @var \Magento\Catalog\Api\Data\ProductLinkInterface $link */ foreach ($linksByType as $link) { $assignedSkuList[] = $link->getLinkedProductSku(); } $linkedProductIds = $this->resourceModel->getProductsIdsBySkus($assignedSkuList); $linksToInitialize = []; foreach ($linksByType as $link) { $linkDataArray = $this->extensibleDataObjectConverter ->toNestedArray($link, [], 'Magento\Catalog\Api\Data\ProductLinkInterface'); $linkedSku = $link->getLinkedProductSku(); if (!isset($linkedProductIds[$linkedSku])) { throw new NoSuchEntityException( __('Product with SKU "%1" does not exist', $linkedSku) ); } $linkDataArray['product_id'] = $linkedProductIds[$linkedSku]; $linksToInitialize[$linkedProductIds[$linkedSku]] = $linkDataArray; } $this->linkInitializer->initializeLinks($product, [$type => $linksToInitialize]); } } $product->setProductLinks($newLinks); return $this; }
/** * {@inheritdoc} */ public function getProductsIdsBySkus(array $productSkuList) { $pluginInfo = $this->pluginList->getNext($this->subjectType, 'getProductsIdsBySkus'); if (!$pluginInfo) { return parent::getProductsIdsBySkus($productSkuList); } else { return $this->___callPlugins('getProductsIdsBySkus', func_get_args(), $pluginInfo); } }