/** * Returns attributes all values in label-value or value-value pairs form. Labels are lower-cased. * * @param \Magento\Eav\Model\Entity\Attribute\AbstractAttribute $attribute * @return array */ public function getAttributeOptions(\Magento\Eav\Model\Entity\Attribute\AbstractAttribute $attribute) { $options = []; if ($attribute->usesSource()) { // should attribute has index (option value) instead of a label? $index = in_array($attribute->getAttributeCode(), $this->_indexValueAttributes) ? 'value' : 'label'; // only default (admin) store values used $attribute->setStoreId(\Magento\Store\Model\Store::DEFAULT_STORE_ID); try { foreach ($attribute->getSource()->getAllOptions(false) as $option) { foreach (is_array($option['value']) ? $option['value'] : [$option] as $innerOption) { if (strlen($innerOption['value'])) { // skip ' -- Please Select -- ' option $options[$innerOption['value']] = $innerOption[$index]; } } } } catch (\Exception $e) { // ignore exceptions connected with source models } } return $options; }
/** * Build attribute select element html string * * @param AbstractAttribute $attribute * @return string */ public function getAttributeSelectElement($attribute) { $extra = ''; $options = $attribute->getSource()->getAllOptions(false); $name = $attribute->getAttributeCode(); // 2 - avoid yes/no selects to be multiselects if (is_array($options) && count($options) > 2) { $extra = 'multiple="multiple" size="4"'; $name .= '[]'; } else { array_unshift($options, ['value' => '', 'label' => __('All')]); } return $this->_getSelectBlock()->setName($name)->setId($attribute->getAttributeCode())->setTitle($this->getAttributeLabel($attribute))->setExtraParams($extra)->setValue($this->getAttributeValue($attribute))->setOptions($options)->setClass('multiselect')->getHtml(); }
/** * @param AbstractAttribute $attribute * @return Data\Eav\AttributeMetadata */ private function createMetadataAttribute($attribute) { $data = $this->booleanPrefixMapper($attribute->getData()); // fill options and validate rules $data[AttributeMetadata::OPTIONS] = $attribute->usesSource() ? $attribute->getSource()->getAllOptions() : array(); $data[AttributeMetadata::VALIDATION_RULES] = $attribute->getValidateRules(); // fill scope $data[AttributeMetadata::SCOPE] = $attribute->isScopeGlobal() ? 'global' : ($attribute->isScopeWebsite() ? 'website' : 'store'); $data[AttributeMetadata::FRONTEND_LABEL] = []; $data[AttributeMetadata::FRONTEND_LABEL][0] = array(FrontendLabel::STORE_ID => 0, FrontendLabel::LABEL => $attribute->getFrontendLabel()); if (is_array($attribute->getStoreLabels())) { foreach ($attribute->getStoreLabels() as $storeId => $label) { $data[AttributeMetadata::FRONTEND_LABEL][$storeId] = array(FrontendLabel::STORE_ID => $storeId, FrontendLabel::LABEL => $label); } } return $this->attributeMetadataBuilder->populateWithArray($data)->create(); }
/** * Get options for all product attribute values from used products * * @param \Magento\Catalog\Model\Product[] $usedProducts * @param AbstractAttribute $productAttribute * @return array */ protected function getIncludedOptions(array $usedProducts, AbstractAttribute $productAttribute) { $attributeValues = []; foreach ($usedProducts as $associatedProduct) { $attributeValues[] = $associatedProduct->getData($productAttribute->getAttributeCode()); } $options = $productAttribute->getSource()->getSpecificOptions(array_unique($attributeValues)); return $options; }