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!

MrTo-Kane
sumber

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();
Marius
sumber
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.

Rakesh Jesadiya
sumber
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/

Liz Eipe C
sumber
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();
saiid
sumber
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)

ajmedway
sumber
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();  
Divya
sumber