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!

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();

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.


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/


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();

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]


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();  
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.