Skip to content

Commit 2e710e1

Browse files
committed
Merge remote-tracking branch 'adobe-commerce-tier-4/ACP2E-2978' into Tier4-Kings-PR-05-17-2024
2 parents e657c98 + eab2af3 commit 2e710e1

File tree

2 files changed

+94
-18
lines changed
  • app/code/Magento/Catalog
    • Controller/Adminhtml/Product/Initialization
    • Test/Unit/Controller/Adminhtml/Product/Initialization

2 files changed

+94
-18
lines changed

app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper.php

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
use Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\CustomOptions;
2424
use Magento\Framework\App\ObjectManager;
2525
use Magento\Framework\App\RequestInterface;
26+
use Magento\Framework\Exception\NoSuchEntityException;
2627
use Magento\Framework\Locale\FormatInterface;
2728
use Magento\Framework\Stdlib\DateTime\Filter\Date;
2829
use Magento\Store\Model\StoreManagerInterface;
@@ -279,6 +280,7 @@ public function initialize(Product $product)
279280
* @param Product $product
280281
* @return Product
281282
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
283+
* @throws NoSuchEntityException
282284
* @since 101.0.0
283285
*/
284286
protected function setProductLinks(Product $product)
@@ -302,20 +304,18 @@ protected function setProductLinks(Product $product)
302304
}
303305

304306
foreach ($linkTypes as $linkType => $readonly) {
305-
if (isset($links[$linkType]) && !$readonly) {
306-
foreach ((array) $links[$linkType] as $linkData) {
307-
if (empty($linkData['id'])) {
308-
continue;
309-
}
310-
311-
$linkProduct = $this->productRepository->getById($linkData['id']);
312-
$link = $this->productLinkFactory->create();
313-
$link->setSku($product->getSku())
314-
->setLinkedProductSku($linkProduct->getSku())
315-
->setLinkType($linkType)
316-
->setPosition(isset($linkData['position']) ? (int) $linkData['position'] : 0);
317-
$productLinks[] = $link;
318-
}
307+
$isReadOnlyLinks = $readonly && in_array($linkType, ['upsell', 'related']);
308+
if ($isReadOnlyLinks) {
309+
$productLinks = null;
310+
break;
311+
} else {
312+
$productLinks = $this->setProductLinksForNotReadOnlyItems(
313+
$productLinks,
314+
$product,
315+
$links,
316+
$linkType,
317+
$readonly
318+
);
319319
}
320320
}
321321

@@ -527,4 +527,39 @@ private function setCategoryLinks(Product $product): void
527527
$extensionAttributes->setCategoryLinks(!empty($newCategoryLinks) ? $newCategoryLinks : null);
528528
$product->setExtensionAttributes($extensionAttributes);
529529
}
530+
531+
/**
532+
* Set product links when readonly is false
533+
*
534+
* @param array $productLinks
535+
* @param Product $product
536+
* @param array $links
537+
* @param string $linkType
538+
* @param mixed $readonly
539+
* @return array
540+
* @throws NoSuchEntityException
541+
*/
542+
private function setProductLinksForNotReadOnlyItems(
543+
array $productLinks,
544+
Product $product,
545+
array $links,
546+
string $linkType,
547+
mixed $readonly
548+
): array {
549+
if (isset($links[$linkType]) && !$readonly) {
550+
foreach ((array)$links[$linkType] as $linkData) {
551+
if (empty($linkData['id'])) {
552+
continue;
553+
}
554+
$linkProduct = $this->productRepository->getById($linkData['id']);
555+
$link = $this->productLinkFactory->create();
556+
$link->setSku($product->getSku())
557+
->setLinkedProductSku($linkProduct->getSku())
558+
->setLinkType($linkType)
559+
->setPosition(isset($linkData['position']) ? (int)$linkData['position'] : 0);
560+
$productLinks[] = $link;
561+
}
562+
}
563+
return $productLinks;
564+
}
530565
}

app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Initialization/HelperTest.php

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,7 @@ protected function setUp(): void
161161
->getMock();
162162
$this->productLinksMock = $this->createMock(ProductLinks::class);
163163
$this->linkTypeProviderMock = $this->createMock(LinkTypeProvider::class);
164-
$this->productLinksMock->expects($this->any())
165-
->method('initializeLinks')
166-
->willReturn($this->productMock);
164+
167165
$this->attributeFilterMock = $this->createMock(AttributeFilter::class);
168166
$this->localeFormatMock = $this->createMock(Format::class);
169167

@@ -221,6 +219,7 @@ protected function setUp(): void
221219
* @param array|null $tierPrice
222220
* @dataProvider initializeDataProvider
223221
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
222+
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
224223
*/
225224
public function testInitialize(
226225
$isSingleStore,
@@ -229,8 +228,17 @@ public function testInitialize(
229228
$links,
230229
$linkTypes,
231230
$expectedLinks,
232-
$tierPrice = null
231+
$tierPrice = null,
232+
$isReadOnlyRelatedItems = null,
233+
$isReadOnlyUpSellItems = null,
234+
$ignoreLinksFlag = false
233235
) {
236+
$this->productMock->setData('related_readonly', $isReadOnlyRelatedItems);
237+
$this->productMock->setData('upsell_readonly', $isReadOnlyUpSellItems);
238+
$this->productLinksMock->expects($this->any())
239+
->method('initializeLinks')
240+
->willReturn($this->productMock);
241+
234242
$this->linkTypeProviderMock->expects($this->once())
235243
->method('getItems')
236244
->willReturn($this->assembleLinkTypes($linkTypes));
@@ -346,6 +354,11 @@ function () {
346354

347355
$productLinks = $this->productMock->getProductLinks();
348356
$this->assertCount(count($expectedLinks), $productLinks);
357+
if ($ignoreLinksFlag) {
358+
$this->assertTrue($this->productMock->getDataByKey('ignore_links_flag'));
359+
} else {
360+
$this->assertFalse($this->productMock->getDataByKey('ignore_links_flag'));
361+
}
349362
$resultLinks = [];
350363

351364
$this->assertEquals($tierPrice ?: [], $this->productMock->getData('tier_price'));
@@ -559,6 +572,34 @@ public static function initializeDataProvider()
559572
['type' => 'related', 'linked_product_sku' => 'Test'],
560573
],
561574
],
575+
576+
// readonly links
577+
[
578+
'single_store' => false,
579+
'website_ids' => ['1' => 1, '2' => 2],
580+
'expected_website_ids' => ['1' => 1, '2' => 2],
581+
'links' => [
582+
'related' => [
583+
0 => [
584+
'id' => 1,
585+
'thumbnail' => 'http://magento.dev/media/no-image.jpg',
586+
'name' => 'Test',
587+
'status' => 'Enabled',
588+
'attribute_set' => 'Default',
589+
'sku' => 'Test',
590+
'price' => 1.00,
591+
'position' => 1,
592+
'record_id' => 1,
593+
],
594+
],
595+
],
596+
'linkTypes' => ['related', 'upsell', 'crosssell'],
597+
'expected_links' => [],
598+
'tierPrice' => [],
599+
true,
600+
true,
601+
true
602+
],
562603
];
563604
}
564605

0 commit comments

Comments
 (0)