Magento 2-如何获取eav实体的属性选项值?


18

如何获取eav实体的属性选项值?
我发现仅针对magento 1.x的解决方案,但我不知道M2。
M1:

$attr = Mage::getResourceModel('eav/entity_attribute_collection')->setCodeFilter('specialty')->getData()[0];
$attributeModel = Mage::getModel('eav/entity_attribute')->load($attr['attribute_id']);
$src =  $attributeModel->getSource()->getAllOptions();

有人知道,请一步一步给我看!谢谢!

Answers:


55

您可以将\Magento\Eav\Model\Config如下所示的实例添加到类的构造函数中:

protected $eavConfig;
public function __construct(
    ...
    \Magento\Eav\Model\Config $eavConfig,
    ...
){
    ...
    $this->eavConfig = $eavConfig;
    ...
}

然后你可以在课堂上使用它

$attribute = $this->eavConfig->getAttribute('catalog_product', 'attribute_code_here');
$options = $attribute->getSource()->getAllOptions();

如何获得“价值”和“标签”?
MrTo-Kane'3

1
看看结果如何。Var将其丢弃。
马里斯(Marius)

array(2){[0] => array(2){[“” value“] => int(1)[” label“] => object(Magento \ Framework \ Phrase)#1504(2){[” text “:”“ Magento \ Framework \ Phrase”:private] =>字符串(7)“ Enabled” [“ arguments”:“ Magento \ Framework \ Phrase”:private] => array(0){}}} [1] = > array(2){[“” value“] => int(2)[” label“] => object(Magento \ Framework \ Phrase)#1494(2){[” text“:” Magento \ Framework \ Phrase“ :private] => string(8)“ Disabled” [“ arguments”:“ Magento \ Framework \ Phrase”:private] => array(0){}}}}
MrTo-Kane

12
小而重要的说明:如果可用,最好使用模块服务层。对于eav属性,它是\Magento\Eav\Api\Attribute RepositoryInterface。未标记为@api的所有内容均视为私有内容,可以在次要版本中删除。
康迪

5
@KAndy好话。您可以将其写为答案。我认为这比我的要好得多。
马里斯(Marius)

5

您可以简单地在Block文件中调用以下代码来做到这一点。

<?php
namespace Vendor\Package\Block;

class Blockname extends \Magento\Framework\View\Element\Template
{
    protected $_productAttributeRepository;

    public function __construct(        
        \Magento\Framework\View\Element\Template\Context $context,   
        \Magento\Catalog\Model\Product\Attribute\Repository $productAttributeRepository,
        array $data = [] 
    ){        
        parent::__construct($context,$data);
        $this->_productAttributeRepository = $productAttributeRepository;
    } 

    public function getAllBrand(){
        $manufacturerOptions = $this->_productAttributeRepository->get('manufacturer')->getOptions();       
        $values = array();
        foreach ($manufacturerOptions as $manufacturerOption) { 
           //$manufacturerOption->getValue();  // Value
            $values[] = $manufacturerOption->getLabel();  // Label
        }
        return $values;
    }  
}

在您的phtml文件中调用

<div class="manufacturer-name">
      <?php $getOptionValue = $this->getAllBrand();?>
      <?php foreach($getOptionValue as $value){ ?>
           <span><?php echo $value;?></span>
      <?php } ?>
</div>

谢谢。


这不会返回配置为使用swatch输入的属性的选项,例如color。该getOptions()方法被硬编码为某些输入类型,例如“下拉列表”,因此它跳过了样本输入选项。如果还有其他人遇到这个问题,请直言不讳。
thaddeusmt

@Rakesh,您好,我如何做到这一点,但对于Admin。我需要这些选项值用于Grid列过滤器。你能告诉我吗。
拉维·索尼

5

使用以下代码获取所有属性选项。

function getExistingOptions( $object_Manager ) {

$eavConfig = $object_Manager->get('\Magento\Eav\Model\Config');
$attribute = $eavConfig->getAttribute('catalog_product', 'color');
$options = $attribute->getSource()->getAllOptions();

$optionsExists = array();

foreach($options as $option) {
    $optionsExists[] = $option['label'];
}

return $optionsExists;

 }

请您点击这里获取更多详细说明。 http://www.pearlbells.co.uk/code-snippets/get-magento-attribute-options-programmatically/


4

Magento\Eav\Api\AttributeRepositoryInterface在@marius答案的评论中使用@kandy建议的Api服务层。

如下所示将服务数据成员注入构造函数中。

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

然后您可以使用此属性。

$attribute = $this->eavAttributeRepository->get(
    \Magento\Catalog\Model\Product::ENTITY,
    'attribute_code_here'
);
// var_dump($attribute->getData()); 

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

$options = $attribute->getSource()->getAllOptions();

2

\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. 获取选项: $attribute->getOptions()
  2. 获取每个商店的前端标签: $attrTest->getFrontendLabels()
  3. 调试数据数组: echo '> ' . print_r($attrTest->debug(), true);

调试:数组([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_defined] => 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_on_front] => 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] => 00 [is_wysiwyg_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


1
这是一个很好解释的答案
domdambrogia

0
   <?php
      /* to load the Product */
  $_product = $block->getProduct();
  $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
  $attributeSet = $objectManager- 
   >create('Magento\Eav\Api\AttributeSetRepositoryInterface');
  $attributeSetRepository = $attributeSet->get($_product->getAttributeSetId());
  $_attributeValue  = $attributeSetRepository->getAttributeSetName();  
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.