Magento 2 - Como obter o valor das opções de atributo da entidade eav?

18

Como posso obter os valores das opções de atributo da entidade eav?
Encontrei solução apenas para magento 1.x mas M2 não sei.
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();

Alguém sabe, mostre-me passo a passo, pls! Obrigado!

MrTo-Kane
fonte

Respostas:

55

você pode adicionar ao construtor de sua classe uma instância \Magento\Eav\Model\Configcomo esta:

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

então você pode usar isso na sua classe

$attribute = $this->eavConfig->getAttribute('catalog_product', 'attribute_code_here');
$options = $attribute->getSource()->getAllOptions();
Marius
fonte
Como obter "valor" e "etiqueta"?
MrTo-Kane 8/03/16
1
veja como é o resultado. Var despejá-lo ou algo assim.
Marius
matriz (2) {[0] => matriz (2) {["valor"] => int (1) ["label"] => objeto (Magento \ Framework \ Phrase) # 1504 (2) {["text ":" Magento \ Framework \ Phrase ": private] => string (7)" Ativado "[" argumentos ":" Magento \ Framework \ Phrase ": private] => array (0) {}}} [1] = > array (2) {["value"] => int (2) ["label"] => objeto (Magento \ Framework \ Phrase) # 1494 (2) {["text": "Magento \ Framework \ Phrase" : private] => string (8) "Pessoas com Mobilidade" [ "argumentos": "Magento \ Framework \ frase": private] => array (0) {}}}}
MrTo-Kane
12
Observação pequena, mas importante: Se disponível, é melhor usar a Camada de serviço do módulo. Para atributos eav é \Magento\Eav\Api\Attribute RepositoryInterface. Qualquer coisa não marcada como @api é tratada como privada e pode ser removida em versões menores.
Kandy
5
@KAndy Boa observação. Você pode escrever isso como uma resposta. Eu acho que é muito melhor que o meu.
Marius
5

Você pode fazer isso simplesmente chamando o código abaixo dentro do seu arquivo 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;
    }  
}

Ligue dentro do seu arquivo phtml,

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

Obrigado.

Rakesh Jesadiya
fonte
Isso não retorna as opções para atributos configurados para usar swatchentradas, como color. O getOptions()método é codificado para certos tipos de entrada, como "menus suspensos", de modo que ignora as opções de entrada de amostra. Apenas um alerta, se mais alguém se deparar com isso.
Thaddeusmt
Oi @Rakesh, Como faço para conseguir isso mesmo, mas para Admin. Eu preciso desses valores de opção para o filtro de colunas da grade. Você pode, por favor, me dizer.
Ravi Soni
5

Use o código a seguir para obter todas as opções de atributo.

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;

 }

Você pode clicar aqui para obter uma explicação mais detalhada. http://www.pearlbells.co.uk/code-snippets/get-magento-attribute-options-programmatically/

Liz Eipe C
fonte
4

Eu uso a Api Service Layer Magento\Eav\Api\AttributeRepositoryInterfacesugerida por @kandy nos comentários na resposta @marius.

Injete o membro de dados do serviço em seu construtor da seguinte maneira.

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

E você pode obter o atributo usando isso.

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

Para obter a matriz de valores das opções de atributo, use isso.

$options = $attribute->getSource()->getAllOptions();
saiid
fonte
2

Injete uma instância de \Magento\Catalog\Model\Product\Attribute\Repositoryno seu construtor (em um bloco, classe auxiliar ou em qualquer outro lugar):

/**
 * @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;
    ...
}

Em seguida, crie um método em sua classe para obter o atributo por código:

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

Você pode chamar esse método assim, por exemplo, dentro de um arquivo .phtml

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

Então você pode fazer chamadas no objeto de atributo, por exemplo

  1. Obter opções: $attribute->getOptions()
  2. Obtenha um rótulo de front-end para cada loja: $attrTest->getFrontendLabels()
  3. Depure a matriz de dados: echo '> ' . print_r($attrTest->debug(), true);

debug: Array ([attribute_id] => 274 [entity_type_id] => 4 [attribute_code] => product_manual_download_label [backend_type] => varchar [frontend_input] => text [frontend_label] => etiqueta de download manual do produto [is_required] => 0 [ is_user_defined] => 1 [valor_ padrão] => Download do manual do produto [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_invision] => 0 [is_visible_info] => 0 [is_visible_info]0 [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_vister_in_grid] => 1 [is_filterable_in_grid] => 1 [search_weight] => 1 [search_weight] => 1

ajmedway
fonte
1
Este é um muito bem explicado resposta
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();  
Divya
fonte