Skip to content

Commit 3e428cf

Browse files
author
Yu Tang
committed
Merge branch 'FearlessKiwis-MAGETWO-32410-Group-Product-Integration-API-new' into develop
2 parents 8cfb07a + 9edd49e commit 3e428cf

File tree

10 files changed

+1815
-1216
lines changed

10 files changed

+1815
-1216
lines changed

app/code/Magento/Catalog/Model/Product.php

Lines changed: 916 additions & 889 deletions
Large diffs are not rendered by default.

app/code/Magento/Catalog/Model/ProductLink/Management.php

Lines changed: 26 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
namespace Magento\Catalog\Model\ProductLink;
88

99
use Magento\Catalog\Api\Data;
10-
use Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks as LinksInitializer;
1110
use Magento\Framework\Exception\CouldNotSaveException;
1211
use Magento\Framework\Exception\NoSuchEntityException;
1312

@@ -18,52 +17,20 @@ class Management implements \Magento\Catalog\Api\ProductLinkManagementInterface
1817
*/
1918
protected $productRepository;
2019

21-
/**
22-
* @var CollectionProvider
23-
*/
24-
protected $entityCollectionProvider;
25-
26-
/**
27-
* @var LinksInitializer
28-
*/
29-
protected $linkInitializer;
30-
31-
/**
32-
* @var \Magento\Catalog\Api\Data\ProductLinkInterfaceFactory
33-
*/
34-
protected $productLinkFactory;
35-
36-
/**
37-
* @var \Magento\Catalog\Model\Resource\Product
38-
*/
39-
protected $productResource;
40-
4120
/**
4221
* @var \Magento\Catalog\Model\Product\LinkTypeProvider
4322
*/
4423
protected $linkTypeProvider;
4524

4625
/**
4726
* @param \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
48-
* @param CollectionProvider $collectionProvider
49-
* @param \Magento\Catalog\Api\Data\ProductLinkInterfaceFactory $productLinkFactory
50-
* @param LinksInitializer $linkInitializer
51-
* @param \Magento\Catalog\Model\Resource\Product $productResource
5227
* @param \Magento\Catalog\Model\Product\LinkTypeProvider $linkTypeProvider
5328
*/
5429
public function __construct(
5530
\Magento\Catalog\Api\ProductRepositoryInterface $productRepository,
56-
CollectionProvider $collectionProvider,
57-
\Magento\Catalog\Api\Data\ProductLinkInterfaceFactory $productLinkFactory,
58-
LinksInitializer $linkInitializer,
59-
\Magento\Catalog\Model\Resource\Product $productResource,
6031
\Magento\Catalog\Model\Product\LinkTypeProvider $linkTypeProvider
6132
) {
6233
$this->productRepository = $productRepository;
63-
$this->entityCollectionProvider = $collectionProvider;
64-
$this->productLinkFactory = $productLinkFactory;
65-
$this->productResource = $productResource;
66-
$this->linkInitializer = $linkInitializer;
6734
$this->linkTypeProvider = $linkTypeProvider;
6835
}
6936

@@ -73,27 +40,22 @@ public function __construct(
7340
public function getLinkedItemsByType($sku, $type)
7441
{
7542
$output = [];
76-
$product = $this->productRepository->get($sku);
77-
try {
78-
$collection = $this->entityCollectionProvider->getCollection($product, $type);
79-
} catch (NoSuchEntityException $e) {
43+
44+
$linkTypes = $this->linkTypeProvider->getLinkTypes();
45+
46+
if (!isset($linkTypes[$type])) {
8047
throw new NoSuchEntityException(__('Unknown link type: %1', (string)$type));
8148
}
82-
foreach ($collection as $item) {
83-
/** @var \Magento\Catalog\Api\Data\ProductLinkInterface $productLink */
84-
$productLink = $this->productLinkFactory->create();
85-
$productLink->setProductSku($product->getSku())
86-
->setLinkType($type)
87-
->setLinkedProductSku($item['sku'])
88-
->setLinkedProductType($item['type'])
89-
->setPosition($item['position']);
90-
if (isset($item['custom_attributes'])) {
91-
foreach ($item['custom_attributes'] as $option) {
92-
$productLink->getExtensionAttributes()->setQty($option['value']);
93-
}
49+
$product = $this->productRepository->get($sku);
50+
$links = $product->getProductLinks();
51+
52+
// Only return the links of type specified
53+
foreach ($links as $link) {
54+
if ($link->getLinkType() == $type) {
55+
$output[] = $link;
9456
}
95-
$output[] = $productLink;
9657
}
58+
9759
return $output;
9860
}
9961

@@ -111,32 +73,27 @@ public function setProductLinks($sku, $type, array $items)
11173
}
11274

11375
$product = $this->productRepository->get($sku);
114-
$assignedSkuList = [];
115-
/** @var \Magento\Catalog\Api\Data\ProductLinkInterface $link */
116-
foreach ($items as $link) {
117-
$assignedSkuList[] = $link->getLinkedProductSku();
118-
}
119-
$linkedProductIds = $this->productResource->getProductsIdsBySkus($assignedSkuList);
12076

121-
$links = [];
122-
/** @var \Magento\Catalog\Api\Data\ProductLinkInterface[] $items*/
123-
foreach ($items as $link) {
124-
$data = $link->__toArray();
125-
$linkedSku = $link->getLinkedProductSku();
126-
if (!isset($linkedProductIds[$linkedSku])) {
127-
throw new NoSuchEntityException(
128-
__('Product with SKU "%1" does not exist', $linkedSku)
129-
);
77+
// Replace only links of the specified type
78+
$existingLinks = $product->getProductLinks();
79+
$newLinks = [];
80+
if (!empty($existingLinks)) {
81+
foreach ($existingLinks as $link) {
82+
if ($link->getLinkType() != $type) {
83+
$newLinks[] = $link;
84+
}
13085
}
131-
$data['product_id'] = $linkedProductIds[$linkedSku];
132-
$links[$linkedProductIds[$linkedSku]] = $data;
86+
$newLinks = array_merge($newLinks, $items);
87+
} else {
88+
$newLinks = $items;
13389
}
134-
$this->linkInitializer->initializeLinks($product, [$type => $links]);
90+
$product->setProductLinks($newLinks);
13591
try {
136-
$product->save();
92+
$this->productRepository->save($product);
13793
} catch (\Exception $exception) {
13894
throw new CouldNotSaveException(__('Invalid data provided for linked products'));
13995
}
96+
14097
return true;
14198
}
14299
}

app/code/Magento/Catalog/Model/ProductRepository.php

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,16 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
7575
*/
7676
protected $linkInitializer;
7777

78+
/*
79+
* @param \Magento\Catalog\Model\Product\LinkTypeProvider
80+
*/
81+
protected $linkTypeProvider;
82+
83+
/*
84+
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
85+
*/
86+
protected $storeManager;
87+
7888
/**
7989
* @var \Magento\Catalog\Api\ProductAttributeRepositoryInterface
8090
*/
@@ -129,6 +139,8 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa
129139
* @param \Magento\Catalog\Api\ProductAttributeRepositoryInterface $attributeRepository
130140
* @param Resource\Product $resourceModel
131141
* @param \Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks $linkInitializer
142+
* @param \Magento\Catalog\Model\Product\LinkTypeProvider $linkTypeProvider
143+
* @param \Magento\Store\Model\StoreManagerInterface $storeManager,
132144
* @param \Magento\Framework\Api\FilterBuilder $filterBuilder
133145
* @param \Magento\Catalog\Api\ProductAttributeRepositoryInterface $metadataServiceInterface
134146
* @param \Magento\Framework\Api\ExtensibleDataObjectConverter $extensibleDataObjectConverter
@@ -149,6 +161,8 @@ public function __construct(
149161
\Magento\Catalog\Api\ProductAttributeRepositoryInterface $attributeRepository,
150162
\Magento\Catalog\Model\Resource\Product $resourceModel,
151163
\Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks $linkInitializer,
164+
\Magento\Catalog\Model\Product\LinkTypeProvider $linkTypeProvider,
165+
\Magento\Store\Model\StoreManagerInterface $storeManager,
152166
\Magento\Framework\Api\FilterBuilder $filterBuilder,
153167
\Magento\Catalog\Api\ProductAttributeRepositoryInterface $metadataServiceInterface,
154168
\Magento\Framework\Api\ExtensibleDataObjectConverter $extensibleDataObjectConverter,
@@ -166,6 +180,8 @@ public function __construct(
166180
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
167181
$this->resourceModel = $resourceModel;
168182
$this->linkInitializer = $linkInitializer;
183+
$this->linkTypeProvider = $linkTypeProvider;
184+
$this->storeManager = $storeManager;
169185
$this->attributeRepository = $attributeRepository;
170186
$this->filterBuilder = $filterBuilder;
171187
$this->metadataService = $metadataServiceInterface;
@@ -260,6 +276,9 @@ protected function initializeProductData(array $productData, $createNew)
260276
{
261277
if ($createNew) {
262278
$product = $this->productFactory->create();
279+
if ($this->storeManager->hasSingleStore()) {
280+
$product->setWebsiteIds([$this->storeManager->getStore(true)->getWebsite()->getId()]);
281+
}
263282
} else {
264283
unset($this->instances[$productData['sku']]);
265284
$product = $this->get($productData['sku']);
@@ -353,11 +372,12 @@ private function processLinks(\Magento\Catalog\Api\Data\ProductInterface $produc
353372
}
354373

355374
// Clear all existing product links and then set the ones we want
356-
$this->linkInitializer->initializeLinks($product, ['related' => []]);
357-
$this->linkInitializer->initializeLinks($product, ['upsell' => []]);
358-
$this->linkInitializer->initializeLinks($product, ['crosssell' => []]);
375+
$linkTypes = $this->linkTypeProvider->getLinkTypes();
376+
foreach($linkTypes as $typeName => $typeValue) {
377+
$this->linkInitializer->initializeLinks($product, [$typeName => []]);
378+
}
359379

360-
// Gather each linktype info
380+
// Set each linktype info
361381
if (!empty($newLinks)) {
362382
$productLinks = [];
363383
foreach ($newLinks as $link) {

0 commit comments

Comments
 (0)