Skip to content

Commit 33ab2f8

Browse files
committed
MAGETWO-52124: Simple product special price lost if use it in grouped product
1 parent 074392d commit 33ab2f8

File tree

3 files changed

+178
-0
lines changed

3 files changed

+178
-0
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
<?php
2+
/**
3+
* Copyright © 2015 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\GroupedProduct\Model\ResourceModel\Product\Link;
8+
9+
use Magento\Catalog\Model\ProductLink\LinkFactory;
10+
use Magento\Catalog\Model\ResourceModel\Product\Link;
11+
use Magento\Catalog\Model\ResourceModel\Product\Relation;
12+
13+
class RelationPersister
14+
{
15+
/**
16+
* @var Relation
17+
*/
18+
private $relationProcessor;
19+
/**
20+
* @var LinkFactory
21+
*/
22+
private $linkFactory;
23+
24+
/**
25+
* @inheritDoc
26+
*/
27+
public function __construct(Relation $relationProcessor, LinkFactory $linkFactory)
28+
{
29+
$this->relationProcessor = $relationProcessor;
30+
$this->linkFactory = $linkFactory;
31+
}
32+
33+
/**
34+
* Save grouped products to product relation table
35+
*
36+
* @param Link $subject
37+
* @param \Closure $proceed
38+
* @param $parentId
39+
* @param $data
40+
* @param $typeId
41+
* @return Link
42+
*/
43+
public function aroundSaveProductLinks(Link $subject, \Closure $proceed, $parentId, $data, $typeId)
44+
{
45+
$result = $proceed($parentId, $data, $typeId);
46+
if ($typeId == \Magento\GroupedProduct\Model\ResourceModel\Product\Link::LINK_TYPE_GROUPED) {
47+
foreach ($data as $linkData) {
48+
$this->relationProcessor->addRelation(
49+
$parentId,
50+
$linkData['product_id']
51+
);
52+
}
53+
}
54+
return $result;
55+
}
56+
57+
/**
58+
* Remove grouped products from product relation table
59+
*
60+
* @param Link $subject
61+
* @param \Closure $proceed
62+
* @param $linkId
63+
* @return Link
64+
*/
65+
public function aroundDeleteProductLink(Link $subject, \Closure $proceed, $linkId)
66+
{
67+
/** @var \Magento\Catalog\Model\ProductLink\Link $link */
68+
$link = $this->linkFactory->create();
69+
$subject->load($link, $linkId, $subject->getIdFieldName());
70+
$result = $proceed($linkId);
71+
if ($link->getLinkTypeId() == \Magento\GroupedProduct\Model\ResourceModel\Product\Link::LINK_TYPE_GROUPED) {
72+
$this->relationProcessor->removeRelations(
73+
$link->getProductId(),
74+
$link->getLinkedProductId()
75+
);
76+
}
77+
return $result;
78+
}
79+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\GroupedProduct\Test\Unit\Model\ResourceModel\Product\Link;
8+
9+
use Magento\GroupedProduct\Model\ResourceModel\Product\Link\RelationPersister;
10+
use Magento\Catalog\Model\ProductLink\LinkFactory;
11+
use Magento\Catalog\Model\Product\Link;
12+
use Magento\Catalog\Model\ResourceModel\Product\Relation;
13+
14+
class RelationPersisterTest extends \PHPUnit_Framework_TestCase
15+
{
16+
/** @var RelationPersister|PHPUnit_Framework_MockObject_MockObject */
17+
private $object;
18+
19+
/** @var Link */
20+
private $link;
21+
22+
/** @var Relation */
23+
private $relationProcessor;
24+
25+
/**
26+
* @inheritDoc
27+
*/
28+
protected function setUp()
29+
{
30+
$linkFactory = $this->getMockBuilder(LinkFactory::class)
31+
->setMethods(['create'])
32+
->disableOriginalConstructor()
33+
->getMock();
34+
35+
$this->relationProcessor = $this->getMockBuilder(Relation::class)
36+
->disableOriginalConstructor()
37+
->getMock();
38+
39+
$this->link = $this->getMockBuilder(Link::class)
40+
->setMethods(['getLinkTypeId', 'getProductId', 'getLinkedProductId'])
41+
->disableOriginalConstructor()
42+
->getMock();
43+
44+
$linkFactory->expects($this->any())->method('create')->willReturn($this->link);
45+
46+
$this->object = new RelationPersister(
47+
$this->relationProcessor,
48+
$linkFactory
49+
);
50+
}
51+
52+
public function testAroundSaveProductLinks()
53+
{
54+
$subject = $this->getMockBuilder(\Magento\Catalog\Model\ResourceModel\Product\Link::class)
55+
->disableOriginalConstructor()
56+
->getMock();
57+
$this->relationProcessor->expects($this->once())->method('addRelation')->with(2, 10);
58+
$this->assertEquals($subject, $this->object->aroundSaveProductLinks(
59+
$subject,
60+
function() use ($subject) { return $subject; },
61+
2,
62+
[['product_id' => 10]],
63+
3
64+
));
65+
}
66+
67+
public function testAroundDeleteProductLink()
68+
{
69+
$subject = $this->getMockBuilder(\Magento\Catalog\Model\ResourceModel\Product\Link::class)
70+
->disableOriginalConstructor()
71+
->getMock();
72+
$subject->expects($this->any())->method('getIdFieldName')->willReturn('id');
73+
$subject->expects($this->once())->method('load')->with($this->link, 155, 'id');
74+
75+
$this->link->expects($this->any())
76+
->method('getLinkTypeId')
77+
->willReturn(\Magento\GroupedProduct\Model\ResourceModel\Product\Link::LINK_TYPE_GROUPED);
78+
$this->link->expects($this->any())
79+
->method('getProductId')
80+
->willReturn(12);
81+
$this->link->expects($this->any())
82+
->method('getLinkedProductId')
83+
->willReturn(13);
84+
85+
$this->relationProcessor->expects($this->once())->method('removeRelations')->with(12, 13);
86+
$this->assertEquals(
87+
$subject,
88+
$this->object->aroundDeleteProductLink(
89+
$subject,
90+
function() use ($subject) { return $subject; },
91+
155
92+
)
93+
);
94+
95+
}
96+
}

app/code/Magento/GroupedProduct/etc/di.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@
7777
<type name="Magento\Catalog\Model\Product\Initialization\Helper\ProductLinks">
7878
<plugin name="GroupedProduct" type="Magento\GroupedProduct\Model\Product\Initialization\Helper\ProductLinks\Plugin\Grouped" />
7979
</type>
80+
<type name="\Magento\Catalog\Model\ResourceModel\Product\Link">
81+
<plugin name="groupedProductLinkProcessor" type="Magento\GroupedProduct\Model\ResourceModel\Product\Link\RelationPersister" />
82+
</type>
8083
<type name="Magento\Catalog\Model\ProductLink\Converter\ConverterPool">
8184
<arguments>
8285
<argument name="converters" xsi:type="array">

0 commit comments

Comments
 (0)