Dapatkan atribut produk dalam keranjang di Magento2

21

Saya mencoba mengambil atribut produk di templat keranjang. Tapi saya tidak bekerja! Atribut diatur ke Terlihat pada Halaman Katalog di Storefront = yes dan Digunakan di Daftar Produk = ya

Saya menggunakan modul khusus untuk mengganti template berikut:

/vendor/magento/module-checkout/view/frontend/templates/cart/item/default.phtml

Saya punya produk:

$_item = $block->getItem();
$product = $_item->getProduct();

Biasanya saya akan mengharapkan atribut khusus (tipe teks-daerah dalam kasus ini) dengan kode atribut 'sample_attr' tersedia dengan salah satu dari ini:

$product->getData('sample_attr');

atau

$product->getSampleAttr();

Beberapa atribut tersedia menggunakan ini (sku, berat, harga ..), tetapi untuk atribut khusus tidak berfungsi. Penolong yang disertakan (\ Magento \ Msrp \ Helper \ Data) juga tidak memiliki metode atribut.

Saya bisa mendapatkan semua kode atribut menggunakan:

   $attributes = $product->getAttributes();
   foreach($attributes as $a)
   {
     var_dump($a->getName());
   }

Saya juga sudah mencoba:

    $attribute = $product->getResource()->getAttribute('sample_attr');
    var_dump($attribute->getFrontend()->getValue($product));

tapi ini mengembalikan nol.

Jadi, bagaimana saya mendapatkan nilai atribut?

Saya sudah mencoba ini: Dapatkan atribut spesifik untuk setiap produk di halaman katalog

Keluarkan atribut teks khusus di catalog list.phtml (Magento 2)

tecjam
sumber

Jawaban:

51

Tidak perlu mengubah kode PHP apa pun untuk melakukan ini.

Anda hanya perlu membuat {MODULE_NAME}/etc/catalog_attributes.xmldengan konten seperti itu:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/catalog_attributes.xsd">
    <group name="quote_item">
        <attribute name="sample_attr"/>
    </group>
</config>
Igor Sydorenko
sumber
Menarik. Saya tidak memikirkan itu. Saya akan mencobanya nanti.
tecjam
Sama-sama
2
Fantastis! Bekerja untukku. Sepertinya saya harus lari magento setup:di:compileagar ini berhasil, tetapi itu masuk akal. Anda mengubah pohon ketergantungan di sini.
psyklopz
Ini harus menjadi jawaban IMHO yang diterima. Jawaban lain menyarankan memuat model produk untuk setiap item keranjang yang bukan ide yang baik untuk alasan kinerja, terutama ketika keranjang pengguna besar.
Andrew Kett
Saya telah membuat modul tenx / checkoutex di bawah dll. Saya telah menempatkan kode di atas tetapi tidak berfungsi, bisakah Anda membantu saya
Sarvesh Tiwari
8

Jadi saya menemukan cara untuk mendapatkan informasi yang saya cari. Saya harus memuat produk lengkap dari ProductRepository! Perhatikan bahwa jika Anda mencoba dan memuatnya, \Magento\Catalog\Model\Productakan berperilaku seperti orang tunggal, selalu memberi Anda produk yang sama untuk setiap loop.

Saya menggunakan kelas pembantu modul saya karena mendefinisikan metode berikut untuk memuat produk dari productId:

public function __construct(
  \Magento\Framework\App\Helper\Context $context,
  \Magento\Catalog\Model\ProductRepository $productRepo
) {
  $this->_productRepo = $productRepo;
  parent::__construct($context);
  }


/**
 * Load product from productId
 *
 * @param $id
 * @return $this
 */
public function getProductById($id)
{
    return $this->_productRepo
        ->getById($id);
}

Saya menyertakan helper dalam templat:

$customHelper = $this->helper('MyCompany\MyModule\Helper\Data');

Saya memuat produk lengkap:

$custProd = $customHelper->getProductById($product->getId());

Dan sekarang saya bisa menggunakan:

$custProd->getSampleAttr();

dan

$custProd->getData('sample_attr');

untuk mendapatkan data.

tecjam
sumber
2

Bagi mereka yang mendarat di sini mencari solusi sederhana, begitulah cara saya bekerja

Saya ditambahkan ke saya default.phtml(di module-checkout/view/frontend/templates/cart/item) ini:

<?php
    $product_id = $product->getId();
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $customProduct = $objectManager->get('Magento\Catalog\Model\Product')->load($product_id);
 ?>

maka Anda dapat menelepon $customProduct->getData('your_attribute');seperti biasa

Luca G
sumber
2
Dalam templat, Magento mencegah kami menggunakan ObjectManager secara langsung. Kami harus menambahkan di blok.
Khoa TruongDinh
2
Anda seharusnya tidak menggunakan ObjectManager secara langsung di template, atau di blok.
ocornu
Jika Anda tidak peduli bagaimana caranya, 100% ini berfungsi.
A. Lal
1

Dengan pengaturan admin yang benar, atribut khusus dimuat di objek produk di halaman Checkout jika model sumber dalam eav_attributetabel sql diatur ke NULL. Jadi, Anda dapat mengakses langsung $product->getSampleAttr()di Halaman Checkout.

Tetapi jika atribut memiliki model sumber sebagai Magento\Eav\Model\Entity\Attribute\Source\Table , Anda harus memuat produk dari repositori.

Buat pembantu baru dan tambahkan gudang produk di konstruktor masih bekerja pada 2.2.6 (sebagai solusi tecjam)

Harap perhatikan bahwa masalahnya sama jika Anda mencoba untuk mengganti penyaji item (disebut di Halaman Checkout) dan menambahkan gudang produk di sini.

masukkan deskripsi gambar di sini

Jakk64
sumber
0

Atribut khusus tidak termasuk dalam objek produk yang ditemukan dalam Kutipan / Keranjang, sehingga Anda tidak bisa mendapatkannya melalui fungsi getData ('custom_attribute'). yang perlu Anda lakukan adalah mendapatkan ID produk yang dikembalikan dari objek produk Kutipan dan memuat produk menggunakan repositori produk, setelah Anda memuat produk melalui repositori maka Anda bisa mendapatkan semua data termasuk atribut khusus yang ditugaskan untuk itu, nanti Anda bisa menggunakan fungsi getData ('custom_attribute') untuk mendapatkannya.

Semoga ini masuk akal.

Zeeshan Khuwaja
sumber