Magento 2 - Bagaimana cara mendapatkan nilai opsi atribut entitas eav?


18

Bagaimana saya bisa mendapatkan nilai opsi atribut entitas eav?
Saya menemukan solusi hanya untuk magento 1.x tetapi M2 saya tidak tahu.
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();

Ada yang tahu, tunjukkan selangkah demi selangkah, terima kasih!

Jawaban:


55

Anda dapat menambahkan ke konstruktor kelas Anda dengan instance \Magento\Eav\Model\Configseperti ini:

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

maka Anda dapat menggunakannya di kelas Anda

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

Bagaimana cara mendapatkan "nilai" dan "label"?
MrTo-Kane

1
lihat bagaimana hasilnya. Var membuangnya atau apalah.
Marius

array (2) {[0] => array (2) {["value"] => int (1) ["label"] => objek (Frasa Magento \ Framework \) # 1504 (2) {["teks ":" Magento \ Framework \ Phrase ": private] => string (7)" Diaktifkan "[" argumen ":" Magento \ Framework \ Frase ": private] => array (0) {}}} [1] = > array (2) {["value"] => int (2) ["label"] => objek (Magento \ Framework \ Frase) # 1494 (2) {["text": "Magento \ Framework \ Phrase" : private] => string (8) "Nonaktifkan" ["argumen": "Magento \ Framework \ Frase": private] => array (0) {}}}}
MrTo-Kane

12
Ucapan kecil tapi penting: Jika tersedia, lebih baik menggunakan Modul Layanan Lapisan. Untuk atribut eav itu \Magento\Eav\Api\Attribute RepositoryInterface. Apa pun yang tidak ditandai sebagai @api diperlakukan sebagai pribadi dan dapat dihapus dalam rilis minor.
KAndy

5
@KAndy Ucapan yang bagus. Anda dapat menuliskannya sebagai jawaban. Saya pikir ini jauh lebih baik daripada milik saya.
Marius

5

Anda dapat melakukannya cukup memanggil kode di bawah ini di dalam file Block Anda.

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

Panggil ke dalam file phtml Anda,

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

Terima kasih.


Ini tidak mengembalikan opsi untuk atribut yang dikonfigurasi untuk menggunakan swatchinput, seperti color. The getOptions()Metode sulit dikodekan untuk jenis masukan tertentu, seperti "dropdown", sehingga melompat pilihan input swatch. Hanya kepala jika ada orang lain berlari ke sana.
thaddeusmt

Hai @Rakesh, Bagaimana saya mencapai hal ini tetapi untuk Admin. Saya perlu nilai opsi ini untuk filter kolom Grid. Bisakah Anda memberi tahu saya.
Ravi Soni

5

Gunakan kode berikut untuk mendapatkan semua opsi atribut.

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;

 }

Silakan dapat Anda klik di sini untuk penjelasan lebih rinci. http://www.pearlbells.co.uk/code-snippets/get-magento-attribute-options-programmatically/


4

Saya menggunakan Layer Layanan Api yang Magento\Eav\Api\AttributeRepositoryInterfacedisarankan oleh @kandy dalam komentar pada jawaban @marius.

Suntikkan anggota data layanan di konstruktor Anda sebagai berikut.

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

Dan Anda bisa mendapatkan atribut menggunakan ini.

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

Untuk mendapatkan array nilai opsi atribut, gunakan ini.

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

2

Suntikkan instance \Magento\Catalog\Model\Product\Attribute\Repositorydalam konstruktor Anda (dalam blok, kelas pembantu atau di mana pun):

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

Kemudian buat metode di kelas Anda untuk mendapatkan atribut dengan kode:

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

Anda kemudian dapat memanggil metode ini seperti itu, misalnya di dalam file .phtml

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

Kemudian Anda dapat membuat panggilan pada objek atribut, mis

  1. Dapatkan opsi: $attribute->getOptions()
  2. Dapatkan label frontend untuk setiap toko: $attrTest->getFrontendLabels()
  3. Debug array data: echo '> ' . print_r($attrTest->debug(), true);

debug: Array ([atribut_id] => 274 [entitas_type_id] => 4 [atribut_code] => product_manual_download_label [backend_type] => varchar [frontend_input] => teks [frontend_label] => Label Unduh Manual Produk [is_required] => 0 [ is_user_defined] => 1 [default_value] => Unduh Manual Produk [is_unique] => 0 [is_global] => 0 [is_visible] => 1 [is_searchable] => 0 [is_filterable] => 0 [is_comparable] => 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 [posisi_dari_peningkatan_penempatan_penempatan_penempatan_penempatan_penempatan_penempatan_penempatan_penambahan_ harga]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)


1
Ini adalah jawaban yang dijelaskan dengan sangat baik
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();  
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.