Ich versuche, der Produktseite im Bereich "Social Sharing" eine benutzerdefinierte Vorlage hinzuzufügen. In meinem Modul habe ich folgenden Code in der Layoutdatei default.xml
<body>
<referenceContainer name="product.info.social">
<block class="Magento\Framework\View\Element\Template" name="product.info.custom" template="Lapisbard_Product::social.phtml" after="product.info.addtocart">
</block>
</referenceContainer>
</body>
Inhalt von social.phtml
<p>Hey there !</p>
<?php //$_product = $block->getProduct();
Es funktioniert einwandfrei und zeigt Vorlageninhalte auf der Produktseite an. Wenn ich stattdessen eine Blockklasse Magento\Catalog\Block\Product\View
verwende, Magento\Framework\View\Element\Template
damit ich das Produktobjekt in meiner Vorlage verwenden kann $block->getProduct();
, wird eine leere Seite angezeigt.
1. Welchen Fehler mache ich hier?
2. Wie kann die Produktseite am besten geändert werden?
3. Gibt es eine Referenzlayoutdatei, mit der ich jedem Abschnitt der Produktseite, der Layoutcode in meinem Modul schreibt, neue Vorlagen hinzufügen kann?
$_product = $block->getProduct();
wenn ichMagento\Catalog\Block\Product\View
Block verwende.Antworten:
Der Fehler "Weiße Seite" tritt auf, weil
Magento\Framework\View\Element\Template
keinegetProduct()
Methode vorhanden ist.Daher denke ich, dass der "sauberste" Weg, dies zu tun, darin besteht, ein benutzerdefiniertes Modul mit einem benutzerdefinierten Block, Layout und Vorlage zu erstellen (keine Sorge, dies dauert nur ein paar Minuten und Sie haben einige Teile erledigt).
Moduldateien:
(Ich werde überspringen
/etc/module.xml
undregistration.php
weil es trivial ist, aber das vollständige Beispiel finden Sie hier .)Beginnen wir mit der Block-PHP-Datei:
Wie Sie sehen, handelt es sich nur um eine konkrete Klasse, die den leichtesten Product Abstract Block (IMO) erweitert. Sie können auch erweitern,
Magento\Framework\View\Element\Template
aber in diesem Fall müssen Sie diegetProduct()
Methode implementieren und den Kontext im Konstruktor ändern, um Zugriff auf die Registrierung zu erhalten.Gehen wir also zur Layoutdatei:
Und zum Schluss die Vorlagendatei:
Wie Sie sehen können, ist es ziemlich einfach, am einfachsten als M1-
Denken Sie daran, dass Ihre gesamte benutzerdefinierte Logik in der
Extra.php
Blockklasse implementiert werden sollte, um die Ansicht sauber zu halten.dh:
quelle
Eine Ergänzung zur akzeptierten Antwort
Die akzeptierte Antwort ist gut, aber die
AbstractProduct
ist jetzt veraltet .Also müssen wir das verwenden
Magento\Framework\Registry
, um den Block zu erreichen . Das Block-Beispiel ist unten:quelle