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?
getProduct()
inMagento\Catalog\Block\Product\View
Antworten:
Einer der empfohlenen Wege, um das aktuelle Produkt zu erhalten, ist:
Magento\Catalog\Block\Product\View\AbstractView
.$block->getProduct()
in Ihrer HTML-Datei.quelle
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:
quelle
Wenn Sie Magento 2.1 oder höher verwenden, können Sie dies verwenden,
helper
da die alte Methode veraltet ist.quelle
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 wiegetProductName()
die öffentliche Methode.quelle
getProduct()
ist privat undgetProductName()
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.