在列表页面上添加自定义块:Magento2


10

我想在列表页面[Magento-2]上添加我的自定义块,但不对list.phtml任何.phtml文件进行任何修改。使用xml文件有可能吗?

在此处输入图片说明

任何帮助将不胜感激。


很棒的文章。您是否会在test.phtml上扩展更多详细信息以覆盖原始列表页面?正如我在Magento的新丁2

如何在test.phtml中的网格上使用功能getProductDetailsHtml()在网格上添加新标签“ label”?
克莱

Answers:


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中。
Slimshadddyyy

@Vikram到现在为止,我觉得这是迄今为止最好的方法,并且也正在为我好..
Keyur沙阿

@KeyurShah,我已经di.xml使用上面的方法重写了它。现在如何在列表页面中显示我的自定义属性值?
Slimshadddyyy

@Vikram,您可以使用Mageev2代码显示您的自定义属性。我的意思是,在test.phtml中,您可以获取$ product对象,而从$ product对象中可以轻松获取其属性值。
Keyur Shah

4

当前您无法执行此操作,因为产品输出的所有逻辑均已硬编码在list.phtml模板中。


是的,我知道,但是有什么钩子或任何技巧可利用吗?顺便说一句,感谢您的信息。
Keyur Shah 2013年

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模板,则可以在其他模板中执行类似的操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.