Bagaimana saya mendapatkan produk saat ini di Magento2?

15

Saya mencoba mengambil atribut produk saat ini di blok di Magento 2. Saya bisa mendapatkan produk, seperti id 1:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$product = $objectManager->create('\Magento\Catalog\Model\ProductRepository')->getById(1);

Saya tidak tahu bagaimana cara mendapatkan ID produk saat ini. Bagaimana aku melakukan itu?

Tim Trampedach
sumber
kamu dapat memanggil function getProduct()inMagento\Catalog\Block\Product\View
xanka
di mana kamu ingin mendapatkan produk saat ini?
Amit Bera
Saya menambahkan modul untuk menunjukkan spesifikasi produk (atribut) di tab pada halaman produk. Masalah dipecahkan melalui $ block-> getProduct () per jawaban dari Rahil Patel.
Tim Trampedach
Silakan periksa tautan di bawah ini mageplaza.com/how-get-current-product-category-magento-2.html Anda bisa mendapatkan produk saat ini menggunakan registri. Terima kasih !!
Mukesh Prajapati
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah. - Dari Ulasan
Jai

Jawaban:

11

Untuk mendapatkan produk saat ini, salah satu cara yang disarankan adalah:

  1. Memperpanjang atau kelas penggunaan blok: Magento\Catalog\Block\Product\View\AbstractView.
  2. Dapatkan produk menggunakan: $block->getProduct()dalam file phtml Anda.
Rahil Patel
sumber
6
Atau Anda dapat mencoba $ this -> _ coreRegistry-> registry ('product'); demikian juga!!
Rahil Patel
# 2 bekerja dengan sangat baik. Tidak yakin mengapa saya tidak bisa mengetahuinya sendiri. Terima kasih atas bantuan Anda!
Tim Trampedach
Bisakah Anda membantu saya mendapatkan kesalahan dalam memuat () untuk mendapatkan id produk $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ currentproduct = $ objectManager-> create ('Vendor \ Module \ Model \ Queue') -> load ($ productId);
Sushivam
@SachinS Harap berikan detail lebih lanjut sehingga saya dapat membantu Anda.
Rahil Patel
2
AbstractView dimulai dengan modal A Magento \ Catalog \ Block \ Product \ View \ AbstractView
Patrick van Bergen
28

Meskipun jawaban lain benar, mereka juga bukan solusi yang disarankan / tepat

Menggunakan ObjectManager benar-benar dilarang di Magento 2. Jadi tolong jangan mengandalkan solusi ini, tetapi gunakan DI yang tepat untuk mencapai ini. Untuk mempelajari cara menggunakan DI di Magento 2, lihat sumber daya ini: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/depend-inj.html

Memperluas AbstractView tidak perlu. Jika Anda melihat fungsi asli di AbstractView, Anda dapat melihat Magento menggunakan registri untuk mengambil produk. Anda tidak perlu memperpanjang kelas khusus untuk melakukan ini, cukup menyuntikkan Magento \ Framework \ Registry ke konstruktor Anda dan meminta item registri "produk".

Contoh kode lengkap:

<?php

// Example = Module namespace, Module = module name, rest of the namespace is just for example only, change this to whatever it is in your case.
namespace Example\Module\Block\Frontend\Catalog\Product\General;

use Magento\Catalog\Model\Product;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Registry;
use Magento\Framework\View\Element\Template;

class Information extends Template
{

    /**
     * @var Registry
     */
    protected $registry;

    /**
     * @var Product
     */
    private $product;

    public function __construct(Template\Context $context,
                                Registry $registry,
                                array $data)
    {
        $this->registry = $registry;

        parent::__construct($context, $data);
    }


    /**
     * @return Product
     */
    private function getProduct()
    {
        if (is_null($this->product)) {
            $this->product = $this->registry->registry('product');

            if (!$this->product->getId()) {
                throw new LocalizedException(__('Failed to initialize product'));
            }
        }

        return $this->product;
    }

    public function getProductName()
    {
        return $this->getProduct()->getName();
    }

}
Wesley Vestjens
sumber
selamat datang di Magento SE. Jika Anda memiliki komentar tentang jawaban lain, silakan gunakan tautan "tambahkan komentar" untuk melakukannya. Silakan tulis jawaban yang berdiri di atas sebanyak mungkin dan jangan bergantung pada jawaban lain. Jawaban lain mungkin dihapus atau mungkin "menghilang" ke bagian bawah halaman.
7ochem
@ 7ochem minta maaf, katanya saya belum diizinkan berkomentar, itu sebabnya saya melakukannya seperti ini, saya akan menggunakan komentar yang tepat di masa depan. :)
Wesley Vestjens
Saya sudah memiliki modul dan dapatkah Anda memandu cara menggunakan fungsi Anda dalam modul saya saat ini? DAN saya akan mengatakan, penjelasan Anda adalah yang terbaik yang perlu saya terapkan dalam modul saya. Terima kasih
Sharma
Hai Sharma, sulit untuk mengatakan dengan tepat tanpa melihat kode, tetapi idenya tetap sama: di konstruktor Anda (yang dengan 2 garis bawah), tambahkan argumen baru dan masukkan Magento \ Framework \ Registry ke dalam blokir Anda. Kemudian, gunakan registri untuk mendapatkan produk seperti ini: $ this-> product = $ this-> registry-> registry ('product');
Wesley Vestjens
1
Pendaftaran tidak digunakan lagi dan metode @ rafael-corrêa-gomes harus digunakan sebagai gantinya.
Christophe Ferreboeuf
5

Jika Anda menggunakan Magento 2.1 atau mayor, Anda dapat menggunakan ini helperkarena metode lama sudah usang.

...
use Magento\Catalog\Helper\Data;
...

public function __construct(
        Context $context,
        Data $helper,
        array $data = []
    ){
        $this->context = $context;
        $this->helper = $helper;
        $this->data = $data;
        parent::__construct($context, $data);
    }

...

public function getProduct(){
    if(is_null($this->_product)){
        $this->_product = $this->helper->getProduct();
    }
    return $this->_product;
}
Rafael Corrêa Gomes
sumber
0

Solusi @Wesley Vestjens bekerja untuk saya juga. Pastikan untuk memperhatikan pengubah akses, karena privat mungkin bukan yang Anda inginkan jika Anda gunakan getProduct()di templat Anda. Dalam contoh di atas berfungsi sebagai getProductName()metode publik untuk digunakan.

Joshua Fricke
sumber
Biasanya disarankan untuk tidak memberikan seluruh objek ke templat, tetapi meneruskan data yang diperlukan dan tidak lebih. Itu sebabnya getProduct()bersifat pribadi dan getProductName()bersifat publik. Dalam versi Magento yang lebih baru (2.2 / 2.3 dan seterusnya) metode ini juga dianggap usang dan Model Tampilan harus digunakan sebagai gantinya.
Wesley Vestjens