Fügen Sie auf der Listingseite einen benutzerdefinierten Block hinzu: Magento2

10

Ich möchte meinen benutzerdefinierten Block auf der Listenseite [Magento-2] hinzufügen, jedoch ohne Änderungen an list.phtmloder einer.phtml Datei. Gibt es eine Möglichkeit, eine xmlDatei zu verwenden?

Geben Sie hier die Bildbeschreibung ein

Jede Hilfe wird geschätzt.

Keyur Shah
quelle
Großartiger Artikel. Würden Sie die Datei test.phtml näher erläutern, um die ursprüngliche Listenseite zu überschreiben? Da ich ein Neuling auf Magento 2 bin.
Wie kann ich die Funktion getProductDetailsHtml () verwenden, um den Block 'label' NEW on grid in test.phtml hinzuzufügen?
Kllee

Antworten:

10

Sie können dies tun, wenn Sie ein neues Modul erstellen, um diesen Block zu überschreiben: vendor\magento\module-catalog\Block\Product\ListProduct.php

diesen Block außer Kraft zu setzen, müssen Sie erstellen di.xmlaufapp\code\Vendor\Module_Name\etc

di.xml Inhalt:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\Module_Name\Block\Product\ListProduct" />
</config>

Erstellen Sie einen neuen Dateinamen ListProduct.phpunterapp\code\Vendor\Module_Name\Block\Product

ListProduct.php Inhalt:

namespace Vendor\Module_Name\Block\Product;
class ListProduct extends \Magento\Catalog\Block\Product\ListProduct
{
    public function getProductDetailsHtml(\Magento\Catalog\Model\Product $product)
    {
        $html = $this->getLayout()->createBlock('Magento\Framework\View\Element\Template')->setProduct($product)->setTemplate('Vendor_ModuleName::test.phtml')->toHtml();
        $renderer = $this->getDetailsRenderer($product->getTypeId());
        if ($renderer) {
            $renderer->setProduct($product);
            return $html.$renderer->toHtml();
        }
        return '';
    }
}

Sie können den Block Magento\Framework\View\Element\Templatein Ihren Block ändern

test.phtmlDatei erstellen unterapp\code\Vendor\Module_Name\view\frontend\templates

Magierlösung
quelle
Danke für die Information +1 von mir ... Aber können wir ohne Überschreibung erreichen?
Keyur Shah
@KeyurShah, ist die bisher beste Methode in Mage 2.0, um Ihren benutzerdefinierten Block auf der Listingseite hinzuzufügen? Ich stimme auch Kandy zu, da die Produktausgabe in list.phtml fest codiert ist.
Slimshadddyyy
@ Vikram bis jetzt, ich denke, dies ist die bisher beste Methode und funktioniert auch gut für mich ..
Keyur Shah
@KeyurShah, ich habe das bereits mit der di.xmlobigen Methode überschrieben . Wie kann ich nun meinen benutzerdefinierten Attributwert auf der Listenseite anzeigen?
Slimshadddyyy
@ Vikram Sie können Mageev2-Code verwenden, um Ihr benutzerdefiniertes Attribut anzuzeigen. Ich meine, in test.phtml können Sie $ product object und von $ product object leicht den Attributwert erhalten.
Keyur Shah
4

Derzeit können Sie dies nicht tun, da die gesamte Logik der Produktausgabe in der list.phtmlVorlage fest codiert ist .

KAndy
quelle
Ja, das weiß ich. Aber gibt es dafür einen Haken oder einen Trick? Übrigens, danke für die Information.
Keyur Shah
0

Hier ist meine Sicht auf die Lösung - aber Sie müssen die list.phtmlVorlage ändern :

catalog_category_view.xml

<referenceBlock name="category.products.list">
    <block class="Magento\Catalog\Block\Product\ProductList\Item\Container" name="custom.block.container" as="custom-block-container">
        <block class="Magento\Catalog\Block\Product\ProductList\Item\Block" name="custom.block" as="custom-block"
           template="Magento_Catalog::product/view/custom-block.phtml" />
    </block>
</referenceBlock>

In custom-block.phtmlkönnen Sie das Produkt wie folgt erhalten:

$_product = $block->getProduct();

Sie müssen die list.phtmlVorlage jedoch überschreiben ... Fügen Sie dies einfach dort hinzu, wo Ihr benutzerdefinierter Block angezeigt werden soll:

<?php if ($customBlock = $block->getChildBlock('custom-block-container')): ?>
    <?= $customBlock->setProduct($_product)->getChildHtml() ?>
<?php endif; ?>

Wenn Sie wirklich vermeiden möchten, die list.phtmlVorlage zu ändern , können Sie möglicherweise etwas Ähnliches tun, jedoch in einer anderen Vorlage.

Zankar
quelle