Magento 2: Dapatkan id opsi pilih atribut produk, label untuk produk yang dapat dikonfigurasi

19

Bagaimana cara mendapatkan nilai opsi berdasarkan id opsi di Magento, atau mendapatkan id opsi berdasarkan kode opsi?

Contoh: bagaimana cara mendapatkan opsi atribut warna id 10 dari label "Merah", dan mendapatkan nilai "Merah" jika id opsi adalah 10?

Arnaud
sumber

Jawaban:

46

Anda dapat melakukannya sama seperti Magento 1,

Informasi lebih lanjut, Kunjungi, Dapatkan id Opsi dan Label dari produk yang dapat dikonfigurasi

// dapatkan label opsi berdasarkan id opsi dari objek produk

$optionId = 10;

$attr = $_product->getResource()->getAttribute('color');
 if ($attr->usesSource()) {
       $optionText = $attr->getSource()->getOptionText($optionId);
 }
//get option text ex. Red

// dapatkan id opsi berdasarkan label opsi

$attr = $_product->getResource()->getAttribute('color');
 if ($attr->usesSource()) {
       $option_id = $attr->getSource()->getOptionId("Red");
 }

//get option id ex. 10
Rakesh Jesadiya
sumber
Bisakah Anda ceritakan apa gunanya $ attr-> usesSource () sambil mendapatkan opsi atribut
Jaisa
Saya mendapat opsi tanpa syarat jika apa yang telah Anda sebutkan dalam kode Anda
Jaisa
Bisakah Anda jelaskan, Jika saya salah
Jaisa
1
rakesh sempurna bhai mlishu kyarek avad ma :)! membuatku bahagia!!! +1 :)
SagarPPanchal
Terima kasih, saya menggunakan kode ini tetapi saya menghadapi masalah sekarang. Lihat magento.stackexchange.com/questions/256510/… . Apakah mungkin ada metode alternatif untuk mencapai hasil yang sama?
Akif
12

Praktik terbaik di Magento adalah melakukannya melalui xml.

Untuk mendapatkan atribut standar seperti brandAnda melakukan sesuatu seperti ini catalog_product_view.xmlmisalnya:

<referenceBlock name="product.info.main">
    <block class="Magento\Catalog\Block\Product\View\Description" name="product.info.brand" template="product/view/attribute.phtml" before="-">
        <arguments>
            <argument name="at_call" xsi:type="string">getBrand</argument>
            <argument name="at_code" xsi:type="string">brand</argument>
            <argument name="css_class" xsi:type="string">brand</argument>
            <argument name="at_label" xsi:type="string">none</argument>
            <argument name="add_attribute" xsi:type="string">itemprop="brand"</argument>
        </arguments>
    </block>
</referenceBlock>

Ini akan mendapatkan nilai atribut input atau textarea. Jika Anda memiliki dropdown, Anda harus menggunakan jenis teks, jadi tambahkan baris ini dalam daftar argumen:

<argument name="at_type" xsi:type="string">text</argument>

Tidak perlu membuat file atau menulis kode php apa pun untuk mendapatkan atribut. Dengan cara ini Anda akan memiliki konsistensi dan menggunakan file atribut.phtml yang sama untuk semua atribut. Jika ada perubahan, Anda perlu mengubahnya di satu tempat saja.

Claudiu Creanga
sumber
Anda baru saja menyelamatkan hari saya, saya tidak bisa mendapatkan teks 'dropdown', dan saya menemukan ini. jadi terima kasih.
Arun Karnawat
11

Bekerja untukku

$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);
Nathaniel Meyer
sumber
6

Gunakan Metode Pabrik

   protected $_attributeLoading;

   public function __construct( 
        .....
          \Magento\Catalog\Model\ResourceModel\ProductFactory   $attributeLoading,  
          ....
                                ) {
            parent::__construct($context);

            ....
            $this->_attributeLoading = $attributeLoading;
            ....

    }


   public function getAttributeOptionId($attribute,$label)
    {
        $poductReource=$this->_attributeLoading->create();
        $attr = $poductReource->getAttribute($attribute);
         if ($attr->usesSource()) {
                return  $option_id = $attr->getSource()->getOptionId($label);
         }
    }
   public function getAttributeOptionText($attribute,$label)
    {
        $poductReource=$this->_attributeLoading->create();
        $attr = $poductReource->getAttribute($attribute);
         if ($attr->usesSource()) {
                return  $option_Text = $attr->getSource()->getOptionText($label);
         }
    }

dalam file phtml

  $this->getAttributeOptionId('color','//optionLabel');
  $this->getAttributeOptionText('color','//optionId');
Qaisar Satti
sumber
hi @Qaisar, bisakah kita membuat atribut secara programatis tanpa installer
jafar pinjar
@jafarpinjar ya Anda bisa melakukannya. menggunakan kode yang sama.
Qaisar Satti
6

saya mendapatkan solusi sederhana. ini hanya akan menampilkan nilai atribut dengan kode atribut untuk suatu produk. Saya telah memeriksa halaman katalog dan detail.

kodenya

<?php echo $_product->getAttributeText('size'); ?>

di sini ukuran adalah nama atribut.

referensi: vendor / magento / modul-katalog / view / frontend / templates / produk / view / attribute.phtml baris: 35

Rafiqul Islam
sumber
2

$product->getResource()memiliki catatan DocBlock tentang menjadi usang setidaknya di v2.2.2 dan jadi saya ragu untuk menggunakannya. Datang dengan solusi ini dan bukannya terinspirasi dari yang sudah ada di halaman ini:

$optionId = $product->getDataByKey('attribute_code');
$optionText = null;
$attributes = $product->getAttributes();
if ($optionId && array_key_exists('attribute_code', $attributes)) {
    $attr = $attributes['attribute_code'];
    if ($attr->usesSource()) {
        $optionText = $attr->getSource()->getOptionText($optionId);
    }
}
if ($optionText) {
    //do something with $optionText
}

Untuk referensi, ini adalah metode di AbstractModel.php

/**
 * Retrieve model resource
 *
 * @return \Magento\Framework\Model\ResourceModel\Db\AbstractDb
 * @deprecated 101.0.0 because resource models should be used directly
 */
public function getResource()
{
    return $this->_getResource();
}
Joshua Fricke
sumber
Di mana Anda melihat kode ini di Magento asli? Saya bahkan tidak dapat menemukan getResource()metode dalam model ini: github.com/magento/magento2/blob/2.3-develop/app/code/Magento/…
zitix
getResource()adalah metode yang sebelumnya ada. Dalam v2.2.2 seperti yang saya sebutkan itu sudah dijadwalkan untuk penghinaan. Di cabang 2,3-berkembang saya menduga itu telah selesai. Demikian contoh saya yang tidak membutuhkan fungsi itu.
Joshua Fricke
1

Karena semua orang datang ke sini.

Jika Anda tidak memiliki entitas produk apa pun, Anda dapat mengambil nilai opsi dengan langkah-langkah ini.

Suntikkan \Magento\Eav\Api\AttributeRepositoryInterfaceke kelas Anda

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

Gunakan repo untuk mendapatkan instance atribut

// 4 is the default entity_type_id for product
$attribute = $this->attributeRepository->get('4', '[attribute_code]');

Gunakan $attributeuntuk mendapatkan id opsi dari nilai opsi

$optionId = $attribute->getSource()->getOptionId('[option_value]');
LucScu
sumber
1

Anda dapat menggunakan untuk mendapatkan label atribut

$product->getResource()->getAttribute($key)->getFrontend()->getLabel($product);

Anda bisa menggunakan manajer objek:

$pid = 1;
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$pdata = $objectManager->create('Magento\Catalog\Model\Product')->load($pid);

$getlable = $pdata->getResource()->getAttribute($key)->getFrontend()->getLabel($pdata);
Pradip Garchar
sumber
0

Silakan coba kode ini

Langkah 1) Pertama, Anda harus memuat produk

$_productCollection = $block->getLoadedProductCollection();

Langkah 2) Di halaman daftar produk, akan ada loop foreach untuk daftar produk seperti ini

foreach ($_productCollection as $_product)

Langkah 3) Kode Anda akan berada di dalam loop ini. Tempatkan kode di bawah ini di tempat di mana Anda ingin menampilkan label atribut.

$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);

Cukup ganti your_attribute_code Anda dengan apa pun nama atribut Anda.

Divya Muralidharan
sumber