getTypeInstance()->getConfigurableAttributes($product) as $attribute) { $attributeOptionsData = $this->getAttributeOptionsData($attribute, $options); if ($attributeOptionsData) { $productAttribute = $attribute->getProductAttribute(); $attributeId = $productAttribute->getId(); $attributes[$attributeId] = [ 'id' => $attributeId, 'code' => $productAttribute->getAttributeCode(), 'label' => $productAttribute->getStoreLabel($product->getStoreId()), 'options' => $attributeOptionsData, 'position' => $attribute->getPosition(), ]; $defaultValues[$attributeId] = $this->getAttributeConfigValue($attributeId, $product); } } return [ 'attributes' => $attributes, 'defaultValues' => $defaultValues, ]; } /** * @param Attribute $attribute * @param array $config * @return array */ protected function getAttributeOptionsData($attribute, $config) { $attributeOptionsData = []; foreach ($attribute->getOptions() as $attributeOption) { $optionId = $attributeOption['value_index']; $attributeOptionsData[] = [ 'id' => $optionId, 'label' => $attributeOption['label'], 'products' => isset($config[$attribute->getAttributeId()][$optionId]) ? $config[$attribute->getAttributeId()][$optionId] : [], ]; } return $attributeOptionsData; } /** * @param int $attributeId * @param Product $product * @return mixed|null */ protected function getAttributeConfigValue($attributeId, $product) { return $product->hasPreconfiguredValues() ? $product->getPreconfiguredValues()->getData('super_attribute/' . $attributeId) : null; } }