如何在Magento 2.0中通过属性代码获得产品属性选项


How to get Product Attribute Options by attribute code in Magento 2.0

我正在尝试检索下拉属性列表,并检查该值是否存在(如果存在,我需要获取该值并将其分配给产品),如果不存在,我将不得不创建它并获取其值以将其分配到产品。

$attribute = $this->objectManager->create('Magento'Eav'Model'Entity'Attribute');
$attributeId = $attribute->getIdByCode('catalog_product','manufacturer');
$model = $this->objectManager->create('Magento'Catalog'Model'ResourceModel'Eav'Attribute');
$model->load($attributeId);
print_r($model->getFrontendLabel());

遵循Magento 2的指导原则,您不应该自己使用ObjectManager。相反,您必须使用依赖项注入。更多信息点击这里

在您的Block/Controller/Helper…中。。。,创建一个构造函数并注入'Magento'Catalog'Api'ProductAttributeRepositoryInterface类。例如:

private 'Magento'Catalog'Api'ProductAttributeRepositoryInterface $productAttributeRepository;
public function __construct(
    'Magento'Catalog'Api'ProductAttributeRepositoryInterface $productAttributeRepository
) {
    $this->productAttributeRepository = $productAttributeRepository;
}

然后,在您的专用方法中,您希望调用(为清晰起见添加了PHPDoc):

/** @var 'Magento'Eav'Api'Data'AttributeOptionInterface[] $manufacturerOptions */
$manufacturerOptions = $this->productAttributeRepository->get('manufacturer')->getOptions();

您现在可以通过以下方式获取选项值和标签:

foreach ($manufacturerOptions as $manufacturerOption) {
    $manufacturerOption->getValue();  // Value
    $manufacturerOption->getLabel();  // Label
}
<?php echo $_product->getResource()->getAttribute('movement')->getFrontend()->getValue($_product);?>

$_product是product的对象上面的代码返回属性名称"movement"的属性值。

使用API服务层,对于任何实体类型的EAV属性,在构造函数中注入服务数据成员,如下所示。

protected $eavAttributeRepository;
public function __construct(
    ...
    'Magento'Eav'Api'AttributeRepositoryInterface $eavAttributeRepositoryInterface,
    ...
){
    ...
    $this->eavAttributeRepository = $eavAttributeRepositoryInterface;
    ...
}

你可以用这个得到属性。

$attribute = $this->eavAttributeRepository->get('catalog_product', 'attribute_code_here');
// vardump($attribute->getData());

为了获得属性选项值数组,请使用此。

$options = $attribute->getSource()->getAllOptions();
Try the following code
$attribute_code = "coffe_type";
$objectManager =  'Magento'Framework'App'ObjectManager::getInstance();
$eavConfig = $objectManager->get(''Magento'Eav'Model'Config');
$attribute = $eavConfig->getAttribute('catalog_product',$attribute_code );
$options = $attribute->getSource()->getAllOptions();
foreach($options as $option) {
    $optionsExists[] = array('label' => $option['label'], 'value'=> $option['value'] );
}
print_r($optionsExists);

在构造函数中注入'Magento'Catalog'Model'Product'Attribute'Repository的实例(在块、辅助类或任何位置):

/**
 * @var 'Magento'Catalog'Model'Product'Attribute'Repository $_productAttributeRepository
 */
protected $_productAttributeRepository;
/**
 * ...
 * @param 'Magento'Catalog'Model'Product'Attribute'Repository $productAttributeRepository
 * ...
 */
public function __construct(
    ...
    'Magento'Catalog'Model'Product'Attribute'Repository $productAttributeRepository,
    ...
) {
    ...
    $this->_productAttributeRepository = $productAttributeRepository;
    ...
}

然后在类中创建一个方法,通过代码获取属性:

/**
 * Get single product attribute data 
 *
 * @return Magento'Catalog'Api'Data'ProductAttributeInterface
 */
public function getProductAttributeByCode($code)
{
    $attribute = $this->_productAttributeRepository->get($code);
    return $attribute;
}

然后您可以这样调用这个方法,例如在.phtml文件中

$attrTest = $block->getProductAttributeByCode('test');

然后您可以对属性对象进行调用,例如

  1. 获取选项:$attrTest->getOptions()
  2. 获取每个店铺的前端标签:$attrTest->getFrontendLabels()
  3. 调试数据数组:echo '> ' . print_r($attrTest->debug(), true);

debug:数组([attribute_id]=>274[entity_type_id]=>4[attribute_code]=>product_manual_download_label[backend_type]=>varchar[frontend_input]=>文本[frontend_label]=>产品手册下载标签[is_required]=>0[is_user_define]=>1[default_value]=>产品手册下载[is_unique]=>0[is_global]=>0[is_visible]=>1[is_searchable]=>0[is_filterable]=>0[is_comparable]=>0[is_visible_on_front]=>0[is_html_allowed_onfront]=>1[is_used_for_price_rules]=>0[is_filterable_in_search]=>0[used_in_product_listing]=>0[used_for_sort_by]=>0[is_visible_in_advanced_search]=>0[位置]=>0[is_wiswyg_enabled]=>0[is_used_for_promo_rules]=>0[is_required_in_admin_store]=>0[is_used_in_grid]=>1[is_visible_in_grid]=>1[is_filterable_in_grid]=>1[search_weight]=>1)