Jak uzyskać obecny produkt w Magento2?


15

Próbuję pobrać atrybuty bieżącego produktu w bloku w Magento 2. Mogę uzyskać produkt, na przykład id 1:

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

Nie wiem jednak, jak uzyskać identyfikator bieżącego produktu. Jak mogę to zrobić?


możesz wywołać funkcję getProduct()wMagento\Catalog\Block\Product\View
xanka

gdzie chcesz uzyskać aktualny produkt?
Amit Bera

Dodaję moduł, aby wyświetlić specyfikacje produktu (atrybuty) w zakładce na stronie produktu. Problem rozwiązany za pomocą $ block-> getProduct () na odpowiedź od Rahil Patel.
Tim Trampedach,

Sprawdź poniższe linki mageplaza.com/how-get-current-product-category-magento-2.html Aktualny produkt można uzyskać za pomocą rejestru. Dzięki !!
Mukesh Prajapati

Chociaż ten link może odpowiedzieć na pytanie, lepiej dołączyć tutaj istotne części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli zmieni się połączona strona. - Z recenzji
Jai

Odpowiedzi:


11

Aby uzyskać aktualny produkt, jednym z zalecanych sposobów jest:

  1. Rozszerz lub klasa użycie blok: Magento\Catalog\Block\Product\View\AbstractView.
  2. Uzyskaj produkt za pomocą: $block->getProduct()w pliku phtml.

6
Lub możesz spróbować tego $ this -> _ coreRegistry-> register ('product'); także!!
Rahil Patel,

# 2 działa bardzo dobrze. Nie jestem pewien, dlaczego sam nie mogłem tego rozgryźć. Dzięki za pomoc!
Tim Trampedach,

Czy możesz mi pomóc uzyskać błąd w load (), aby uzyskać identyfikator produktu $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ currentproduct = $ objectManager-> create ('Vendor \ Module \ Model \ Queue') -> load ($ productId);
Sushivam

@SachinS Podaj więcej szczegółów, aby pomóc.
Rahil Patel,

2
AbstractView zaczyna się wielką literą A Magento \ Katalog \ Blok \ Produkt \ Widok \ AbstractView
Patrick van Bergen

29

Chociaż inne odpowiedzi są poprawne, nie są też zalecanym / właściwym rozwiązaniem.

Korzystanie z ObjectManager jest absolutnie zabronione w Magento 2. Dlatego nie polegaj na tym rozwiązaniu, ale zamiast tego użyj odpowiedniego DI. Aby dowiedzieć się, jak korzystać z DI w Magento 2, zobacz ten zasób: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/depend-inj.html

Rozszerzenie AbstractView nie jest konieczne. Jeśli spojrzysz na oryginalną funkcję w AbstractView, zobaczysz, że Magento użył rejestru do pobrania produktu. W tym celu nie trzeba rozszerzać określonej klasy, wystarczy wstrzyknąć Magento \ Framework \ Registry do konstruktora i zażądać elementu rejestru „produkt”.

Przykład pełnego kodu:

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

}

witamy w Magento SE. Jeśli masz komentarze do innych odpowiedzi, skorzystaj z linku „dodaj komentarz”, aby to zrobić. Napisz odpowiedź, która jest samodzielna w jak największym stopniu i nie polegaj na innych odpowiedziach. Inne odpowiedzi mogą zostać usunięte lub „zniknąć” w niższych regionach strony.
7ochem

@ 7ochem przeprosiny, powiedział, że nie wolno mi jeszcze komentować, dlatego zrobiłem to w ten sposób, użyję odpowiednich komentarzy w przyszłości. :)
Wesley Vestjens,

Mam już moduł. Czy możesz wskazać sposób korzystania z funkcji w moim bieżącym module? I powiedziałbym, że twoje wyjaśnienie jest najlepsze, które muszę wdrożyć w moim module. Dzięki
Sharma

Cześć Sharma, trudno powiedzieć dokładnie, nie widząc kodu, ale pomysł pozostaje ten sam: w swoim konstruktorze (ten z 2 podkreśleniami) dodaj nowy argument i wstrzyknij Magento \ Framework \ Registry do swojego bloku. Następnie użyj rejestru, aby uzyskać produkt w następujący sposób: $ this-> product = $ this-> register-> register ('product');
Wesley Vestjens

2
Rejestr jest przestarzały i zamiast tego należy zastosować metodę @ rafael-corrêa-gomes.
Christophe Ferreboeuf

5

Jeśli używasz Magento 2.1 lub wersji major, możesz tego użyć, helperponieważ stara metoda była przestarzała.

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

0

Rozwiązanie @Wesley Vestjens również dla mnie zadziałało. Pamiętaj tylko, aby zwrócić uwagę na modyfikator dostępu, ponieważ prywatny może nie być tym, czego chcesz, jeśli używasz getProduct()w swoim szablonie. W powyższym przykładzie działa tak, jak getProductName()jest to metoda publiczna.


Ogólnie zaleca się, aby nie podawać całych obiektów do szablonu, ale zamiast tego przekazać wymagane dane i nic więcej. Dlatego getProduct()jest prywatny i getProductName()publiczny. W nowszych wersjach Magento (2.2 / 2.3 i nowsze) metody te są również uważane za przestarzałe i zamiast nich należy użyć modeli widoków.
Wesley Vestjens
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.