リストページにカスタムブロックを追加:Magento2


10

リストページ[Magento-2]にカスタムブロックを追加したいのですがファイルファイルを変更していlist.phtmlません.phtmlxmlファイルを使用する可能性はありますか?

ここに画像の説明を入力してください

任意の助けをいただければ幸いです。


素晴らしい記事。test.phtmlの詳細を拡張して、元のリストページを上書きしますか?私は、Magentoの2の新人だとして

testProduct.phtmlのグリッドにブロック 'label' NEWを追加するために、関数getProductDetailsHtml()をどのように使用できますか?
Kllee、2016年

回答:


10

このブロックをオーバーライドする新しいモジュールを作成すると、これを行うことができます。 vendor\magento\module-catalog\Block\Product\ListProduct.php

このブロックを無効にするために、あなたが作成する必要がdi.xmlapp\code\Vendor\Module_Name\etc

di.xml コンテンツ:

<?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>

で新しいファイル名ListProduct.phpを作成app\code\Vendor\Module_Name\Block\Product

ListProduct.php コンテンツ:

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 '';
    }
}

あなたのブロックMagento\Framework\View\Element\Templateをあなたのブロックに変えることができます

test.phtmlファイルを作成app\code\Vendor\Module_Name\view\frontend\templates


私からの+1情報に感謝します...しかし、オーバーライドなしで達成できますか?
Keyur Shah

@KeyurShahは、リストページにカスタムブロックを追加するためのこれまでのMage 2.0の最良の方法を上回っていますか?また、製品の出力はlist.phtmlにハードコーディングされているため、Kandyにも同意します。
Slimshadddyyy 2016

@Vikramは今まで、私はこれはこれまでの最善の方法であり、また私のために正常に動作します。..だと思う
Keyurシャー

@KeyurShah、私はすでにdi.xml上記の方法を使用してそれを上書きしています。リストページにカスタム属性値を表示する方法を教えてください。
Slimshadddyyy 2016

@Vikram Mageev2コードを使用して、カスタム属性を表示できます。つまり、test.phtmlでは$ productオブジェクトを取得でき、$ productオブジェクトからその属性値を簡単に取得できます。
Keyur Shah

4

現在、製品出力のすべてのロジックがlist.phtmlテンプレートにハードコーディングされているため、これを行うことはできません。


ええ、私はそれを知っています、しかし、そのために利用できるフックやトリックはありますか?ところで、情報をありがとう。
Keyur Shah

0

これが私の解決策です-しかし、list.phtmlテンプレートを変更する必要があります:

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>

custom-block.phtmlあなたのこのような製品を得ることができます:

$_product = $block->getProduct();

list.phtmlただし、テンプレートを上書きする必要があります...カスタムブロックを表示する場所にこれを追加するだけです。

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

テンプレートの変更を本当に避けたい場合list.phtmlは、別のテンプレートで同様のことを実行できる場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.