Magento 2 - Jak uzyskać wartość opcji atrybutów encji eav?

18

Jak mogę uzyskać wartości opcji atrybutów encji eav?
Znalazłem rozwiązanie tylko dla Magento 1.x, ale M2 nie wiem.
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();

Ktoś wie, pokaż mi krok po kroku, proszę! Dzięki!

MrTo-Kane
źródło

Odpowiedzi:

55

możesz dodać do konstruktora swojej klasy takie wystąpienie \Magento\Eav\Model\Config:

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

wtedy możesz użyć tego w swojej klasie

$attribute = $this->eavConfig->getAttribute('catalog_product', 'attribute_code_here');
$options = $attribute->getSource()->getAllOptions();
Marius
źródło
Jak zdobyć „wartość” i „etykietę”?
MrTo-Kane
1
zobacz jak wygląda wynik. Var rzuć to czy coś.
Marius
array (2) {[0] => array (2) {["value"] => int (1) ["label"] => object (Magento \ Framework \ Phrase) # 1504 (2) {["tekst ":" Magento \ Framework \ Phrase ": private] => string (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
Mała, ale ważna uwaga: Jeśli jest dostępna, lepiej skorzystać z warstwy serwisowej modułu. W przypadku atrybutów eav jest to \Magento\Eav\Api\Attribute RepositoryInterface. Wszystko, co nie jest oznaczone jako @api traktowane jako prywatne i może być usunięte w mniejszych wersjach.
KAndy
5
@KAndy Dobra uwaga. Możesz to napisać jako odpowiedź. Myślę, że jest znacznie lepszy niż mój.
Marius
5

Możesz to zrobić po prostu wywołać poniższy kod w pliku bloku.

<?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;
    }  
}

Zadzwoń do pliku phtml,

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

Dzięki.

Rakesh Jesadiya
źródło
Nie zwraca to opcji atrybutów skonfigurowanych do używania swatchdanych wejściowych, takich jak color. getOptions()Metoda jest zakodowana do pewnych typów danych wejściowych, jak „rozwijanego menu”, więc pomija opcje wprowadzania próbek. Tylko jedna głowa, jeśli ktoś do tego podejdzie.
thaddeusmt
Cześć @Rakesh, Jak to osiągnąć, ale dla administratora. Potrzebuję tych wartości opcji dla filtru kolumny siatki. Proszę, czy możesz mi powiedzieć.
Ravi Soni,
5

Użyj następującego kodu, aby uzyskać wszystkie opcje atrybutów.

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;

 }

Czy możesz kliknąć tutaj, aby uzyskać bardziej szczegółowe wyjaśnienia. http://www.pearlbells.co.uk/code-snippets/get-magento-attribute-options-programmatically/

Liz Eipe C.
źródło
4

Używam warstwy usługi Magento\Eav\Api\AttributeRepositoryInterfaceinterfejsu API sugerowanej przez @kandy w komentarzach do odpowiedzi @marius.

Wstrzyknij element danych usługi do konstruktora w następujący sposób.

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

I możesz uzyskać ten atrybut za pomocą tego.

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

Aby uzyskać tablicę wartości opcji atrybutów, użyj tego.

$options = $attribute->getSource()->getAllOptions();
saiid
źródło
2

Wstaw instancję do \Magento\Catalog\Model\Product\Attribute\Repositoryswojego konstruktora (w bloku, klasie pomocniczej lub gdziekolwiek):

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

Następnie utwórz metodę w swojej klasie, aby uzyskać atrybut według kodu:

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

Następnie możesz wywołać tę metodę w taki sposób, np. W pliku .phtml

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

Następnie możesz wykonywać wywołania na obiekcie atrybutu, np

  1. Uzyskaj opcje: $attribute->getOptions()
  2. Uzyskaj etykietę frontendową dla każdego sklepu: $attrTest->getFrontendLabels()
  3. Debuguj tablicę danych: echo '> ' . print_r($attrTest->debug(), true);

debug: Array ([id_atrybutu] => 274 [id_typu_jednostki] => 4 [kod_atrybutu] => etykieta_produktu_produktu_manualnego [typ_wendunku] => varchar [nazwa_indeksu_początkowego] => tekst [etykieta_początku] => Instrukcja pobierania Etykieta produktu [is_required] => 0 [ is_user_defined] => 1 [wartość domyślna] => Pobierz instrukcję produktu [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_s__product_listing] => 0 [used_for_sort_by] => 0 [is_visible_in_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_filterable_in_grid] => 1 [waga wyszukiwania]

ajmedway
źródło
1
To jest bardzo dobrze wyjaśniona odpowiedź
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
źródło