Skip to content

Commit 71398ad

Browse files
committed
MAGETWO-67010: [Performance] Swatches real server side optimization
- optimize image load - fix dynamic attribute set generation
1 parent 0fca687 commit 71398ad

File tree

8 files changed

+132
-153
lines changed

8 files changed

+132
-153
lines changed

app/code/Magento/ConfigurableProduct/Block/Product/View/Type/Configurable.php

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
use Magento\ConfigurableProduct\Model\ConfigurableAttributeData;
1111
use Magento\Customer\Helper\Session\CurrentCustomer;
12-
use Magento\Framework\App\ObjectManager;
1312
use Magento\Framework\Pricing\PriceCurrencyInterface;
1413

1514
/**
@@ -60,11 +59,6 @@ class Configurable extends \Magento\Catalog\Block\Product\View\AbstractView
6059
*/
6160
protected $configurableAttributeData;
6261

63-
/**
64-
* @var \Magento\Swatches\Model\Product\Variations\Media
65-
*/
66-
private $variationsMedia;
67-
6862
/**
6963
* @param \Magento\Catalog\Block\Product\Context $context
7064
* @param \Magento\Framework\Stdlib\ArrayUtils $arrayUtils
@@ -75,7 +69,6 @@ class Configurable extends \Magento\Catalog\Block\Product\View\AbstractView
7569
* @param PriceCurrencyInterface $priceCurrency
7670
* @param ConfigurableAttributeData $configurableAttributeData
7771
* @param array $data
78-
* @param \Magento\Swatches\Model\Product\Variations\Media $variationsMedia
7972
*/
8073
public function __construct(
8174
\Magento\Catalog\Block\Product\Context $context,
@@ -86,18 +79,14 @@ public function __construct(
8679
CurrentCustomer $currentCustomer,
8780
PriceCurrencyInterface $priceCurrency,
8881
ConfigurableAttributeData $configurableAttributeData,
89-
array $data = [],
90-
\Magento\Swatches\Model\Product\Variations\Media $variationsMedia = null
82+
array $data = []
9183
) {
9284
$this->priceCurrency = $priceCurrency;
9385
$this->helper = $helper;
9486
$this->jsonEncoder = $jsonEncoder;
9587
$this->catalogProduct = $catalogProduct;
9688
$this->currentCustomer = $currentCustomer;
9789
$this->configurableAttributeData = $configurableAttributeData;
98-
$this->variationsMedia = $variationsMedia
99-
?: ObjectManager::getInstance()->get(\Magento\Swatches\Model\Product\Variations\Media::class);
100-
10190
parent::__construct(
10291
$context,
10392
$arrayUtils,
@@ -223,28 +212,46 @@ public function getJsonConfig()
223212
],
224213
'productId' => $currentProduct->getId(),
225214
'chooseText' => __('Choose an Option...'),
226-
'images' => isset($options['images']) ? $options['images'] : [],
215+
'images' => $this->getImages(),
227216
'index' => isset($options['index']) ? $options['index'] : [],
228217
];
229218

230219
if ($currentProduct->hasPreconfiguredValues() && !empty($attributesData['defaultValues'])) {
231220
$config['defaultValues'] = $attributesData['defaultValues'];
232221
}
233222

234-
// Is there any better way to check that we are on layered navigation search result page?
235-
if (!empty($this->getRequest()->getQuery()->toArray())) {
236-
$config['preSelectedGallery'] = $this->variationsMedia->getProductVariationWithMedia(
237-
$currentProduct,
238-
[],
239-
$this->getRequest()->getQuery()->toArray()
240-
);
241-
}
242-
243223
$config = array_merge($config, $this->_getAdditionalConfig());
244224

245225
return $this->jsonEncoder->encode($config);
246226
}
247227

228+
/**
229+
* Get product images for configurable variations
230+
*
231+
* @return array
232+
*/
233+
protected function getImages()
234+
{
235+
$images = [];
236+
foreach ($this->getAllowProducts() as $product) {
237+
238+
$productImages = $this->helper->getGalleryImages($product) ?: [];
239+
foreach ($productImages as $image) {
240+
$images[$product->getId()][] =
241+
[
242+
'thumb' => $image->getData('small_image_url'),
243+
'img' => $image->getData('medium_image_url'),
244+
'full' => $image->getData('large_image_url'),
245+
'caption' => $image->getLabel(),
246+
'position' => $image->getPosition(),
247+
'isMain' => $image->getFile() == $product->getImage(),
248+
];
249+
}
250+
}
251+
252+
return $images;
253+
}
254+
248255
/**
249256
* @return array
250257
*/

app/code/Magento/ConfigurableProduct/Helper/Data.php

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -78,20 +78,6 @@ public function getOptions($currentProduct, $allowedProducts)
7878
$options = [];
7979
foreach ($allowedProducts as $product) {
8080
$productId = $product->getId();
81-
$images = $this->getGalleryImages($product);
82-
if ($images) {
83-
foreach ($images as $image) {
84-
$options['images'][$productId][] =
85-
[
86-
'thumb' => $image->getData('small_image_url'),
87-
'img' => $image->getData('medium_image_url'),
88-
'full' => $image->getData('large_image_url'),
89-
'caption' => $image->getLabel(),
90-
'position' => $image->getPosition(),
91-
'isMain' => $image->getFile() == $product->getImage(),
92-
];
93-
}
94-
}
9581
foreach ($this->getAllowAttributes($currentProduct) as $attribute) {
9682
$productAttribute = $attribute->getProductAttribute();
9783
$productAttributeId = $productAttribute->getId();

app/code/Magento/Swatches/Block/Product/Renderer/Listing/Configurable.php

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
*/
66
namespace Magento\Swatches\Block\Product\Renderer\Listing;
77

8+
use Magento\Catalog\Model\Product;
9+
810
/**
911
* Swatch renderer block in Category page
1012
*
@@ -58,4 +60,82 @@ public function getJsonConfig()
5860
$this->unsetData('allow_products');
5961
return parent::getJsonConfig();
6062
}
63+
64+
/**
65+
* Do not load images for Configurable product with swatches due to its loaded by request
66+
*
67+
* @return array
68+
*/
69+
protected function getImages()
70+
{
71+
return [];
72+
}
73+
74+
/**
75+
* Add images to result json config in case of Layered Navigation is used
76+
*
77+
* @return array
78+
*/
79+
protected function _getAdditionalConfig()
80+
{
81+
$config = parent::_getAdditionalConfig();
82+
if (!empty($this->getRequest()->getQuery()->toArray())) {
83+
$config['preSelectedGallery'] = $this->getProductVariationWithMedia(
84+
$this->getProduct(),
85+
$this->getRequest()->getQuery()->toArray()
86+
);
87+
}
88+
89+
return $config;
90+
}
91+
92+
/**
93+
* Get product images for chosen variation based on selected product attributes
94+
*
95+
* @param Product $configurableProduct
96+
* @param array $additionalAttributes
97+
* @return array
98+
*/
99+
private function getProductVariationWithMedia(
100+
Product $configurableProduct,
101+
array $additionalAttributes = []
102+
) {
103+
$configurableAttributes = $this->getLayeredAttributesIfExists($configurableProduct, $additionalAttributes);
104+
if (!$configurableAttributes) {
105+
return [];
106+
}
107+
108+
$product = $this->swatchHelper->loadVariationByFallback($configurableProduct, $configurableAttributes);
109+
110+
return $product ? $this->swatchHelper->getProductMediaGallery($product) : [];
111+
}
112+
113+
/**
114+
* Get product attributes which uses in layered navigation and present for given configurable product
115+
*
116+
* @param Product $configurableProduct
117+
* @param array $additionalAttributes
118+
* @return array
119+
*/
120+
private function getLayeredAttributesIfExists(Product $configurableProduct, array $additionalAttributes)
121+
{
122+
$configurableAttributes = $this->swatchHelper->getAttributesFromConfigurable($configurableProduct);
123+
124+
$layeredAttributes = [];
125+
126+
$configurableAttributes = array_map(function ($attribute) {
127+
return $attribute->getAttributeCode();
128+
}, $configurableAttributes);
129+
130+
$commonAttributeCodes = array_intersect(
131+
$configurableAttributes,
132+
array_keys($additionalAttributes)
133+
);
134+
135+
foreach ($commonAttributeCodes as $attributeCode) {
136+
$layeredAttributes[$attributeCode] = $additionalAttributes[$attributeCode];
137+
}
138+
139+
return $layeredAttributes;
140+
}
61141
}

app/code/Magento/Swatches/Controller/Ajax/Media.php

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,41 +20,37 @@ class Media extends \Magento\Framework\App\Action\Action
2020
protected $productModelFactory;
2121

2222
/**
23-
* @var \Magento\Swatches\Model\Product\Variations\Media
23+
* @var \Magento\Swatches\Helper\Data
2424
*/
25-
private $variationsMedia;
25+
private $swatchHelper;
2626

2727
/**
2828
* @param Context $context
2929
* @param \Magento\Catalog\Model\ProductFactory $productModelFactory
30-
* @param \Magento\Swatches\Model\Product\Variations\Media $variationsMedia
30+
* @param \Magento\Swatches\Helper\Data $swatchHelper
3131
*/
3232
public function __construct(
3333
Context $context,
3434
\Magento\Catalog\Model\ProductFactory $productModelFactory,
35-
\Magento\Swatches\Model\Product\Variations\Media $variationsMedia
35+
\Magento\Swatches\Helper\Data $swatchHelper
3636
) {
3737
$this->productModelFactory = $productModelFactory;
38-
$this->variationsMedia = $variationsMedia;
38+
$this->swatchHelper = $swatchHelper;
3939

4040
parent::__construct($context);
4141
}
4242

4343
/**
44-
* Get product media by fallback:
45-
* 1stly by default attribute values
46-
* 2ndly by getting base image from configurable product
44+
* Get product media for specified configurable product variation
4745
*
4846
* @return string
4947
*/
5048
public function execute()
5149
{
5250
$productMedia = [];
5351
if ($productId = (int)$this->getRequest()->getParam('product_id')) {
54-
$productMedia = $this->variationsMedia->getProductVariationWithMedia(
55-
$this->productModelFactory->create()->load($productId),
56-
(array)$this->getRequest()->getParam('attributes'),
57-
(array)$this->getRequest()->getParam('additional')
52+
$productMedia = $this->swatchHelper->getProductMediaGallery(
53+
$this->productModelFactory->create()->load($productId)
5854
);
5955
}
6056

app/code/Magento/Swatches/Helper/Data.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,9 @@ public function loadVariationByFallback(Product $parentProduct, array $attribute
234234
$configurableAttributes = $this->getAttributesFromConfigurable($parentProduct);
235235
$allAttributesArray = [];
236236
foreach ($configurableAttributes as $attribute) {
237-
$allAttributesArray[$attribute['attribute_code']] = $attribute['default_value'];
237+
if (!empty($attribute['default_value'])) {
238+
$allAttributesArray[$attribute['attribute_code']] = $attribute['default_value'];
239+
}
238240
}
239241

240242
$resultAttributesToFilter = array_merge(

app/code/Magento/Swatches/Model/Product/Variations/Media.php

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

0 commit comments

Comments
 (0)