Skip to content

Commit 74dff42

Browse files
committed
MAGETWO-8709: [GITHUB] Child product image should be shown in Wishist if options are selected for configurable product #8168
- refactoring to consolidate code for both cart and wishlist with a composite class - removing and deprecating old references
1 parent c20f7d5 commit 74dff42

File tree

21 files changed

+277
-357
lines changed

21 files changed

+277
-357
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Catalog\Model\Product\Configuration\Item;
7+
8+
/**
9+
* Composite implementation for @see ItemResolverInterface
10+
*/
11+
class ItemResolverComposite implements ItemResolverInterface
12+
{
13+
/** @var ItemResolverInterface[] */
14+
private $itemResolvers = [];
15+
16+
/**
17+
* @param ItemResolverInterface[] $itemResolvers
18+
*/
19+
public function __construct(array $itemResolvers)
20+
{
21+
$this->itemResolvers = $itemResolvers;
22+
}
23+
24+
/**
25+
* {@inheritdoc}
26+
*/
27+
public function getFinalProduct(
28+
\Magento\Catalog\Model\Product\Configuration\Item\ItemInterface $item
29+
) : \Magento\Catalog\Api\Data\ProductInterface {
30+
$product = $item->getProduct();
31+
foreach ($this->itemResolvers as $resolver) {
32+
$resolvedProduct = $resolver->getFinalProduct($item);
33+
if ($resolvedProduct !== $product) {
34+
return $resolvedProduct;
35+
}
36+
}
37+
return $product;
38+
}
39+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Catalog\Model\Product\Configuration\Item;
7+
8+
/**
9+
* Resolves the product for a configured item
10+
*
11+
* @api
12+
*/
13+
interface ItemResolverInterface
14+
{
15+
/**
16+
* Get the final product from a configured item by product type and selection
17+
*
18+
* @param ItemInterface $item
19+
* @return \Magento\Catalog\Api\Data\ProductInterface
20+
*/
21+
public function getFinalProduct(\Magento\Catalog\Model\Product\Configuration\Item\ItemInterface $item)
22+
: \Magento\Catalog\Api\Data\ProductInterface;
23+
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@
7070
<preference for="Magento\Catalog\Api\Data\ProductRender\FormattedPriceInfoInterface" type="Magento\Catalog\Model\ProductRender\FormattedPriceInfo" />
7171
<preference for="Magento\Framework\Indexer\BatchProviderInterface" type="Magento\Framework\Indexer\BatchProvider" />
7272
<preference for="Magento\Catalog\Model\Indexer\Product\Price\UpdateIndexInterface" type="Magento\Catalog\Model\Indexer\Product\Price\InvalidateIndex" />
73-
<preference for="\Magento\Catalog\Model\Product\Gallery\ImagesConfigFactoryInterface" type="\Magento\Catalog\Model\Product\Gallery\ImagesConfigFactory" />
73+
<preference for="Magento\Catalog\Model\Product\Gallery\ImagesConfigFactoryInterface" type="Magento\Catalog\Model\Product\Gallery\ImagesConfigFactory" />
74+
<preference for="Magento\Catalog\Model\Product\Configuration\Item\ItemResolverInterface" type="Magento\Catalog\Model\Product\Configuration\Item\ItemResolverComposite" />
7475
<type name="Magento\Customer\Model\ResourceModel\Visitor">
7576
<plugin name="catalogLog" type="Magento\Catalog\Model\Plugin\Log" />
7677
</type>

app/code/Magento/Checkout/Block/Cart/Item/Renderer.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
use Magento\Framework\View\Element\AbstractBlock;
1212
use Magento\Framework\View\Element\Message\InterpretationStrategyInterface;
1313
use Magento\Quote\Model\Quote\Item\AbstractItem;
14+
use Magento\Framework\App\ObjectManager;
15+
use Magento\Catalog\Model\Product\Configuration\Item\ItemResolverInterface;
1416

1517
/**
1618
* Shopping cart item render block
@@ -21,6 +23,7 @@
2123
* @method \Magento\Checkout\Block\Cart\Item\Renderer setProductName(string)
2224
* @method \Magento\Checkout\Block\Cart\Item\Renderer setDeleteUrl(string)
2325
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
26+
* @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
2427
*/
2528
class Renderer extends \Magento\Framework\View\Element\Template implements
2629
\Magento\Framework\DataObject\IdentityInterface
@@ -91,6 +94,9 @@ class Renderer extends \Magento\Framework\View\Element\Template implements
9194
*/
9295
private $messageInterpretationStrategy;
9396

97+
/** @var ItemResolverInterface */
98+
private $itemResolver;
99+
94100
/**
95101
* @param \Magento\Framework\View\Element\Template\Context $context
96102
* @param \Magento\Catalog\Helper\Product\Configuration $productConfig
@@ -102,6 +108,7 @@ class Renderer extends \Magento\Framework\View\Element\Template implements
102108
* @param \Magento\Framework\Module\Manager $moduleManager
103109
* @param InterpretationStrategyInterface $messageInterpretationStrategy
104110
* @param array $data
111+
* @param ItemResolverInterface|null $itemResolver
105112
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
106113
* @codeCoverageIgnore
107114
*/
@@ -115,7 +122,8 @@ public function __construct(
115122
PriceCurrencyInterface $priceCurrency,
116123
\Magento\Framework\Module\Manager $moduleManager,
117124
InterpretationStrategyInterface $messageInterpretationStrategy,
118-
array $data = []
125+
array $data = [],
126+
ItemResolverInterface $itemResolver = null
119127
) {
120128
$this->priceCurrency = $priceCurrency;
121129
$this->imageBuilder = $imageBuilder;
@@ -127,6 +135,7 @@ public function __construct(
127135
$this->_isScopePrivate = true;
128136
$this->moduleManager = $moduleManager;
129137
$this->messageInterpretationStrategy = $messageInterpretationStrategy;
138+
$this->itemResolver = $itemResolver ?: ObjectManager::getInstance()->get(ItemResolverInterface::class);
130139
}
131140

132141
/**
@@ -172,7 +181,7 @@ public function getProduct()
172181
*/
173182
public function getProductForThumbnail()
174183
{
175-
return $this->getProduct();
184+
return $this->itemResolver->getFinalProduct($this->getItem());
176185
}
177186

178187
/**

app/code/Magento/Checkout/CustomerData/DefaultItem.php

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
namespace Magento\Checkout\CustomerData;
88

99
use Magento\Framework\App\ObjectManager;
10+
use Magento\Catalog\Model\Product\Configuration\Item\ItemResolverInterface;
1011

1112
/**
1213
* Default item
@@ -45,13 +46,17 @@ class DefaultItem extends AbstractItem
4546
*/
4647
private $escaper;
4748

49+
/** @var ItemResolverInterface */
50+
private $itemResolver;
51+
4852
/**
4953
* @param \Magento\Catalog\Helper\Image $imageHelper
5054
* @param \Magento\Msrp\Helper\Data $msrpHelper
5155
* @param \Magento\Framework\UrlInterface $urlBuilder
5256
* @param \Magento\Catalog\Helper\Product\ConfigurationPool $configurationPool
5357
* @param \Magento\Checkout\Helper\Data $checkoutHelper
5458
* @param \Magento\Framework\Escaper|null $escaper
59+
* @param ItemResolverInterface|null $itemResolver
5560
* @codeCoverageIgnore
5661
*/
5762
public function __construct(
@@ -60,22 +65,27 @@ public function __construct(
6065
\Magento\Framework\UrlInterface $urlBuilder,
6166
\Magento\Catalog\Helper\Product\ConfigurationPool $configurationPool,
6267
\Magento\Checkout\Helper\Data $checkoutHelper,
63-
\Magento\Framework\Escaper $escaper = null
68+
\Magento\Framework\Escaper $escaper = null,
69+
ItemResolverInterface $itemResolver = null
6470
) {
6571
$this->configurationPool = $configurationPool;
6672
$this->imageHelper = $imageHelper;
6773
$this->msrpHelper = $msrpHelper;
6874
$this->urlBuilder = $urlBuilder;
6975
$this->checkoutHelper = $checkoutHelper;
7076
$this->escaper = $escaper ?: ObjectManager::getInstance()->get(\Magento\Framework\Escaper::class);
77+
$this->itemResolver = $itemResolver ?: ObjectManager::getInstance()->get(ItemResolverInterface::class);
7178
}
7279

7380
/**
7481
* {@inheritdoc}
7582
*/
7683
protected function doGetItemData()
7784
{
78-
$imageHelper = $this->imageHelper->init($this->getProductForThumbnail(), 'mini_cart_product_thumbnail');
85+
$imageHelper = $this->imageHelper->init(
86+
$this->itemResolver->getFinalProduct($this->item),
87+
'mini_cart_product_thumbnail'
88+
);
7989
$productName = $this->escaper->escapeHtml($this->item->getProduct()->getName());
8090

8191
return [
@@ -115,11 +125,12 @@ protected function getOptionList()
115125

116126
/**
117127
* @return \Magento\Catalog\Model\Product
128+
* @deprecated
118129
* @codeCoverageIgnore
119130
*/
120131
protected function getProductForThumbnail()
121132
{
122-
return $this->getProduct();
133+
return $this->itemResolver->getFinalProduct($this->item);
123134
}
124135

125136
/**

app/code/Magento/Checkout/Model/Cart/ImageProvider.php

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
*/
66
namespace Magento\Checkout\Model\Cart;
77

8+
use Magento\Checkout\CustomerData\DefaultItem;
9+
use Magento\Framework\App\ObjectManager;
10+
811
/**
9-
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
1012
* @api
1113
*/
1214
class ImageProvider
@@ -18,20 +20,26 @@ class ImageProvider
1820

1921
/**
2022
* @var \Magento\Checkout\CustomerData\ItemPoolInterface
23+
* @deprecated
2124
*/
2225
protected $itemPool;
2326

27+
/** @var \Magento\Checkout\CustomerData\DefaultItem */
28+
protected $customerDataItem;
29+
2430
/**
2531
* @param \Magento\Quote\Api\CartItemRepositoryInterface $itemRepository
2632
* @param \Magento\Checkout\CustomerData\ItemPoolInterface $itemPool
27-
* @codeCoverageIgnore
33+
* @param DefaultItem|null $customerDataItem
2834
*/
2935
public function __construct(
3036
\Magento\Quote\Api\CartItemRepositoryInterface $itemRepository,
31-
\Magento\Checkout\CustomerData\ItemPoolInterface $itemPool
37+
\Magento\Checkout\CustomerData\ItemPoolInterface $itemPool,
38+
\Magento\Checkout\CustomerData\DefaultItem $customerDataItem = null
3239
) {
3340
$this->itemRepository = $itemRepository;
3441
$this->itemPool = $itemPool;
42+
$this->customerDataItem = $customerDataItem ?? ObjectManager::getInstance()->get(DefaultItem::class);
3543
}
3644

3745
/**
@@ -45,7 +53,7 @@ public function getImages($cartId)
4553
$items = $this->itemRepository->getList($cartId);
4654
/** @var \Magento\Quote\Model\Quote\Item $cartItem */
4755
foreach ($items as $cartItem) {
48-
$allData = $this->itemPool->getItemData($cartItem);
56+
$allData = $this->customerDataItem->getItemData($cartItem);
4957
$itemData[$cartItem->getItemId()] = $allData['product_image'];
5058
}
5159
return $itemData;

app/code/Magento/Checkout/etc/frontend/di.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
</type>
4040
<preference for="Magento\Checkout\CustomerData\ItemPoolInterface"
4141
type="Magento\Checkout\CustomerData\ItemPool"/>
42-
<type name="Magento\Checkout\CustomerData\ItemPoolInterface">
42+
<type name="Magento\Checkout\CustomerData\ItemPool">
4343
<arguments>
4444
<argument name="defaultItemId" xsi:type="string">Magento\Checkout\CustomerData\DefaultItem</argument>
4545
</arguments>

app/code/Magento/ConfigurableProduct/Block/Cart/Item/Renderer/Configurable.php

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -57,25 +57,11 @@ public function getOptionList()
5757

5858
/**
5959
* {@inheritdoc}
60+
* @deprecated
6061
*/
6162
public function getProductForThumbnail()
6263
{
63-
/**
64-
* Show parent product thumbnail if it must be always shown according to the related setting in system config
65-
* or if child thumbnail is not available
66-
*/
67-
if ($this->_scopeConfig->getValue(
68-
self::CONFIG_THUMBNAIL_SOURCE,
69-
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
70-
) == ThumbnailSource::OPTION_USE_PARENT_IMAGE
71-
|| !($this->getChildProduct()
72-
&& $this->getChildProduct()->getThumbnail() && $this->getChildProduct()->getThumbnail() != 'no_selection')
73-
) {
74-
$product = $this->getProduct();
75-
} else {
76-
$product = $this->getChildProduct();
77-
}
78-
return $product;
64+
return parent::getProductForThumbnail();
7965
}
8066

8167
/**

app/code/Magento/ConfigurableProduct/CustomerData/ConfigurableItem.php

Lines changed: 0 additions & 85 deletions
This file was deleted.

0 commit comments

Comments
 (0)