typeConfigurable = $typeConfigurable; $this->swatchAttributeCodes = $swatchAttributeCodes; $this->swatchTypeChecker = $swatchTypeChecker ?: ObjectManager::getInstance()->create(SwatchAttributeType::class); } /** * Provide list of swatch attributes for product. If product is not configurable return empty array * Key is productId, value is list of attributes * * @param Product $product * @return Attribute[] */ public function provide(Product $product) { if ($product->getTypeId() !== Configurable::TYPE_CODE) { return []; } if (!isset($this->attributesPerProduct[$product->getId()])) { $configurableAttributes = $this->typeConfigurable->getConfigurableAttributes($product); $swatchAttributeCodeMap = $this->swatchAttributeCodes->getCodes(); $swatchAttributes = []; foreach ($configurableAttributes as $configurableAttribute) { if (array_key_exists($configurableAttribute->getAttributeId(), $swatchAttributeCodeMap)) { /** @var AbstractAttribute $productAttribute */ $productAttribute = $configurableAttribute->getProductAttribute(); if ($productAttribute !== null && $this->swatchTypeChecker->isSwatchAttribute($productAttribute) ) { $swatchAttributes[$configurableAttribute->getAttributeId()] = $productAttribute; } } } $this->attributesPerProduct[$product->getId()] = $swatchAttributes; } return $this->attributesPerProduct[$product->getId()]; } }