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.