Ich möchte meinen benutzerdefinierten Block auf der Listenseite [Magento-2] hinzufügen, jedoch ohne Änderungen an list.phtml
oder einer.phtml
Datei. Gibt es eine Möglichkeit, eine xml
Datei zu verwenden?
Jede Hilfe wird geschätzt.
Ich möchte meinen benutzerdefinierten Block auf der Listenseite [Magento-2] hinzufügen, jedoch ohne Änderungen an list.phtml
oder einer.phtml
Datei. Gibt es eine Möglichkeit, eine xml
Datei zu verwenden?
Jede Hilfe wird geschätzt.
Antworten:
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.xml
aufapp\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.php
unterapp\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\Template
in Ihren Block ändern
test.phtml
Datei erstellen unterapp\code\Vendor\Module_Name\view\frontend\templates
di.xml
obigen Methode überschrieben . Wie kann ich nun meinen benutzerdefinierten Attributwert auf der Listenseite anzeigen?
Derzeit können Sie dies nicht tun, da die gesamte Logik der Produktausgabe in der list.phtml
Vorlage fest codiert ist .
Hier ist meine Sicht auf die Lösung - aber Sie müssen die list.phtml
Vorlage ä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.phtml
können Sie das Produkt wie folgt erhalten:
$_product = $block->getProduct();
Sie müssen die list.phtml
Vorlage 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.phtml
Vorlage zu ändern , können Sie möglicherweise etwas Ähnliches tun, jedoch in einer anderen Vorlage.