Magento2: Benutzerdefinierte Vorlage zur Produktdetailseite unten hinzufügen In den Warenkorb

10

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\Viewverwende, Magento\Framework\View\Element\Templatedamit 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?

amitshree
quelle
@amiteshree kann Ihre Phtml-Datei enthält Funktionen, die in Magento \ Catalog \ Block \ Product \ View Block-Datei definiert sind
Shaheer Ali
@ShaheerAli: In meiner HTML-Datei versuche ich, das Produktobjekt zu verwenden, $_product = $block->getProduct();wenn ich Magento\Catalog\Block\Product\ViewBlock verwende.
Amitshree
Warum weisen Sie Ihrer Vorlage dann den Block Magento \ Framework \ View \ Element \ Template zu?
Shaheer Ali
1
@amiteshree Wenn Sie Produktansichtsfunktionen verwenden möchten, müssen Sie Ihrer Vorlage phtml Magento \ Catalog \ Block \ Product \ View zuweisen. Und Ihre Methode zum Hinzufügen einer benutzerdefinierten Vorlage zur Produktseite ist korrekt
Shaheer Ali
1
Eine leere Seite bedeutet normalerweise, dass ein Fehler aufgetreten ist. Hast du in deinem error.log nachgesehen? Magento Ausnahmen Protokoll? Welchen Modus benutzt du?
Anton Kril

Antworten:

24

Der Fehler "Weiße Seite" tritt auf, weil Magento\Framework\View\Element\Templatekeine getProduct()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:

Geben Sie hier die Bildbeschreibung ein

(Ich werde überspringen /etc/module.xmlund registration.phpweil es trivial ist, aber das vollständige Beispiel finden Sie hier .)

Beginnen wir mit der Block-PHP-Datei:

Test \ Katalog \ Block \ Produkt \ Ansicht \ Extra.php

<?php

namespace Test\Catalog\Block\Product\View;

use Magento\Catalog\Block\Product\AbstractProduct;

class Extra extends AbstractProduct
{

}

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\Templateaber in diesem Fall müssen Sie die getProduct()Methode implementieren und den Kontext im Konstruktor ändern, um Zugriff auf die Registrierung zu erhalten.

Gehen wir also zur Layoutdatei:

Test / Catalog / view / frontend / layout / catalog_product_view.xml

<?xml version="1.0"?>
<body>
    <referenceContainer name="product.info.social">
        <block class="Test\Catalog\Block\Product\View\Extra"
            name="product.view.extra"
            template="Test_Catalog::product/view/extra.phtml"
            after="-">
        </block>
    </referenceContainer>
</body>

Und zum Schluss die Vorlagendatei:

Test / Katalog / Ansicht / Frontend / Vorlagen / Produkt / Ansicht / extra.phtml

<?php /* @var $block \Test\Catalog\Block\Product\View\Extra */?>
<?php $_product = $block->getProduct() ?>
<h3><?php echo 'My Product Name Is: ' . $_product->getName(); ?></h3>

Wie Sie sehen können, ist es ziemlich einfach, am einfachsten als M1-

Denken Sie daran, dass Ihre gesamte benutzerdefinierte Logik in der Extra.phpBlockklasse implementiert werden sollte, um die Ansicht sauber zu halten.

dh:

In der Extra.php- Klasse:

public function getSomething()
{
    return 'something'
}

in der extra.phtml- Ansicht:

<?php echo $block->getSomething() ?>
MauroNigrele
quelle
2
Das Layout catalog_product_view.xml meines Moduls wird also automatisch geladen, wenn ich auf der Produktseite bin?
Amitshree
2
Absolut! Es ist M1 sehr ähnlich, aber jetzt befindet sich jedes Handle in einer separaten Datei.
MauroNigrele
5

Eine Ergänzung zur akzeptierten Antwort

Die akzeptierte Antwort ist gut, aber die AbstractProductist jetzt veraltet .

/**
 * Class AbstractProduct
 * @api
 * @deprecated 101.1.0
 * @SuppressWarnings(PHPMD.NumberOfChildren)
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 * @since 100.0.2
 */
class AbstractProduct extends \Magento\Framework\View\Element\Template

Also müssen wir das verwenden Magento\Framework\Registry, um den Block zu erreichen . Das Block-Beispiel ist unten:

<?php
namespace Vendor\Module\Block;

use Magento\Framework\View\Element\Template;
use Magento\Framework\Registry;

class ProductView extends Template
{
    /**
     * @var Registry
     */
    protected $registry;

    /**
     * @var \Magento\Catalog\Model\Product
     */
    protected $product;

    /**
     * ProductView constructor.
     * @param Template\Context $context
     * @param array $data
     * @param Registry $registry
     */
    public function __construct(
        Template\Context $context,
        array $data = [],
        Registry $registry
    )
    {
        $this->registry = $registry;
        parent::__construct($context, $data);
    }

    /**
     * @return \Magento\Catalog\Model\Product
     */
    public function getProduct()
    {
        if (is_null($this->product)) {
            $this->product = $this->registry->registry('product');
        }

        return $this->product;
    }
}
Schlüssel Shang
quelle