swatchHelperData = $swatchesHelperData; $this->eavConfig = $eavConfig; $this->request = $request; } /** * Replace original configurable product with first child * * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @param AbstractProduct $subject * @param ProductModel $product * @param string $location * @param array $attributes * @return array */ public function beforeGetImage( AbstractProduct $subject, ProductModel $product, $location, array $attributes = [] ) { if ($product->getTypeId() == Configurable::TYPE_CODE && ($location == self::CATEGORY_PAGE_GRID_LOCATION || $location == self::CATEGORY_PAGE_LIST_LOCATION)) { $request = $this->request->getParams(); if (is_array($request)) { $filterArray = $this->getFilterArray($request, $product); if (!empty($filterArray)) { $product = $this->loadSimpleVariation($product, $filterArray); } } } return [$product, $location, $attributes]; } /** * @param Product $parentProduct * @param array $filterArray * @return bool|Product */ private function loadSimpleVariation(Product $parentProduct, array $filterArray) { $childProduct = $this->swatchHelperData->loadVariationByFallback($parentProduct, $filterArray); if ($childProduct && !$childProduct->getImage()) { $childProduct = $this->swatchHelperData->loadFirstVariationWithImage($parentProduct, $filterArray); } if (!$childProduct) { $childProduct = $parentProduct; } return $childProduct; } /** * Get filters from request * * @param array $request * @param \Magento\Catalog\Model\Product $product * @return array */ private function getFilterArray(array $request, Product $product) { $filterArray = []; $attributes = $this->eavConfig->getEntityAttributes(Product::ENTITY, $product); foreach ($request as $code => $value) { if (isset($attributes[$code])) { $attribute = $attributes[$code]; if ($this->canReplaceImageWithSwatch($attribute)) { $filterArray[$code] = $value; } } } return $filterArray; } /** * Check if we can replace original image with swatch image on catalog/category/list page * * @param Attribute $attribute * @return bool */ private function canReplaceImageWithSwatch($attribute) { $result = true; if (!$this->swatchHelperData->isSwatchAttribute($attribute)) { $result = false; } if (!$attribute->getUsedInProductListing() || !$attribute->getIsFilterable() || !$attribute->getData('update_product_preview_image') ) { $result = false; } return $result; } }