Wie bekomme ich das aktuelle Produkt in Magento2?

15

Ich versuche, die Attribute des aktuellen Produkts in einem Block in Magento 2 abzurufen. Ich kann ein Produkt wie ID 1 erhalten:

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

Ich weiß jedoch nicht, wie ich die ID des aktuellen Produkts ermitteln soll. Wie mache ich das?

Tim Trampedach
quelle
Sie können Funktion getProduct()in Magento\Catalog\Block\Product\View
aufrufen
Wo möchten Sie das aktuelle Produkt erhalten?
Amit Bera
Ich füge ein Modul hinzu, um die Produktspezifikationen (Attribute) auf einer Registerkarte auf der Produktseite anzuzeigen. Problem gelöst über $ block-> getProduct () per Antwort von Rahil Patel.
Tim Trampedach
Bitte überprüfen Sie die folgenden Links: mageplaza.com/how-get-current-product-category-magento-2.html Sie können das aktuelle Produkt über die Registrierung erhalten. Vielen Dank !!
Mukesh Prajapati
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzuschließen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert. - Aus der Bewertung
Jai

Antworten:

11

Einer der empfohlenen Wege, um das aktuelle Produkt zu erhalten, ist:

  1. Verlängern oder Verwendung Blockklasse: Magento\Catalog\Block\Product\View\AbstractView.
  2. Holen Sie sich das Produkt mit: $block->getProduct()in Ihrer HTML-Datei.
Rahil Patel
quelle
6
Oder probieren Sie diese $ this -> _ coreRegistry-> Registry ('product'); auch!!
Rahil Patel
# 2 funktioniert sehr gut. Ich bin mir nicht sicher, warum ich das nicht selbst herausfinden konnte. Danke für Ihre Hilfe!
Tim Trampedach
Können Sie mir helfen, den Fehler in load () zu erhalten, um die Produkt-ID zu erhalten? $ ObjectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ currentproduct = $ objectManager-> create ('Vendor \ Module \ Model \ Queue') -> load ($ productId);
Sushivam
@SachinS Bitte machen Sie nähere Angaben, damit ich Ihnen weiterhelfen kann.
Rahil Patel
2
AbstractView beginnt mit dem Großbuchstaben A Magento \ Catalog \ Block \ Product \ View \ AbstractView
Patrick van Bergen
28

Obwohl andere Antworten korrekt sind, sind sie auch nicht die empfohlene / richtige Lösung.

Die Verwendung des ObjectManagers ist in Magento 2 absolut verboten. Verlassen Sie sich daher nicht auf diese Lösung, sondern verwenden Sie stattdessen die richtige DI, um dies zu erreichen. Informationen zur Verwendung von DI in Magento 2 finden Sie in dieser Ressource: http://devdocs.magento.com/guides/v2.0/extension-dev-guide/depend-inj.html

Das Erweitern von AbstractView ist nicht erforderlich. Wenn Sie sich die ursprüngliche Funktion in AbstractView ansehen, sehen Sie, dass Magento die Registrierung zum Abrufen des Produkts verwendet hat. Sie müssen keine bestimmte Klasse erweitern, um dies zu tun. Fügen Sie einfach Magento \ Framework \ Registry in Ihren Konstruktor ein und fordern Sie das Registrierungselement "product" an.

Vollständiges Codebeispiel:

<?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
quelle
Willkommen bei Magento SE. Wenn Sie Kommentare zu anderen Antworten haben, verwenden Sie dazu bitte den Link "Kommentar hinzufügen". Bitte schreiben Sie eine möglichst eigenständige Antwort und verlassen Sie sich nicht auf andere Antworten. Andere Antworten werden möglicherweise gelöscht oder "verschwinden" in den unteren Bereichen der Seite.
7ochem
@ 7ochem Entschuldigung, es wurde gesagt, ich durfte noch nicht kommentieren, deshalb habe ich es so gemacht, ich werde in Zukunft die richtigen Kommentare verwenden. :)
Wesley Vestjens
Ich habe bereits ein Modul und können Sie mir bitte erklären, wie Sie Ihre Funktion in meinem aktuellen Modul verwenden können? UND ich würde sagen, du erklärst am besten, was ich in meinem Modul implementieren muss. Danke
Sharma
Hallo Sharma, es ist schwer zu sagen, genau ohne den Code zu sehen, aber die Idee bleibt dieselbe: Fügen Sie in Ihrem Konstruktor (der mit 2 Unterstrichen) ein neues Argument hinzu und fügen Sie Magento \ Framework \ Registry in Ihren Block ein. Verwenden Sie dann die Registrierung, um das Produkt folgendermaßen abzurufen: $ this-> product = $ this-> registry-> registry ('product');
Wesley Vestjens
1
Die Registrierung ist veraltet und die Methode von @ rafael-corrêa-gomes muss stattdessen verwendet werden.
Christophe Ferreboeuf
5

Wenn Sie Magento 2.1 oder höher verwenden, können Sie dies verwenden, helperda die alte Methode veraltet ist.

...
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
quelle
0

Die Lösung von @Wesley Vestjens hat auch bei mir funktioniert. Achten Sie einfach auf den Zugriffsmodifikator, da private möglicherweise nicht das ist, was Sie möchten, wenn Sie getProduct()in Ihrer Vorlage verwenden. Im obigen Beispiel funktioniert es wie getProductName()die öffentliche Methode.

Joshua Fricke
quelle
Im Allgemeinen wird empfohlen, einer Vorlage nicht ganze Objekte zuzuweisen, sondern die erforderlichen Daten und nichts weiter zu übergeben. Deshalb getProduct()ist privat und getProductName()ist öffentlich. In den neueren Magento-Versionen (2.2 / 2.3 und höher) gelten diese Methoden ebenfalls als veraltet und View Models sollten stattdessen verwendet werden.
Wesley Vestjens