Добавить пользовательский блок на странице листинга: Magento2

10

Я хочу добавить свой пользовательский блок на страницу со списком [Magento-2], но без каких-либо изменений list.phtmlили каких-либо.phtml файлов. Есть ли возможность с помощью xmlфайла?

введите описание изображения здесь

Любая помощь будет оценена.

Кейур Шах
источник
Отличная статья. Не могли бы вы расширить подробности в test.phtml, чтобы переопределить страницу оригинального списка? Поскольку я новичок в Magento 2.
Как я могу получить использовать функцию getProductDetailsHtml () для добавления блока 'label' NEW на сетку в test.phtml?
Кли

Ответы:

10

Вы можете сделать это, если создадите новый модуль для переопределения этого блока: vendor\magento\module-catalog\Block\Product\ListProduct.php

чтобы переопределить этот блок, вам нужно создать di.xmlвapp\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 от меня ... Но мы можем достичь без переопределения?
Кейур Шах
@KeyurShah, на данный момент в Mage 2.0 есть лучший способ добавить свой пользовательский блок на страницу со списком? Я также согласен с Канди, поскольку выходные данные продукта жестко запрограммированы в list.phtml.
Slimshadddyyy
@ Викрам до сих пор, я думаю, что это лучший метод на данный момент, и он также хорошо работает для меня ..
Кейур Шах
@KeyurShah, я уже переопределил это с di.xmlиспользованием вышеуказанного метода. Теперь, как отобразить значение моего пользовательского атрибута на странице списка?
Slimshadddyyy
@Vikram вы можете использовать код Mageev2 для отображения вашего пользовательского атрибута. Я имею в виду, что в test.phtml вы можете получить объект $ product, а из объекта $ product вы можете легко получить значение его атрибута.
Кейур Шах
4

В настоящее время вы не можете сделать это, потому что вся логика вывода продукта жестко задана в list.phtmlшаблоне.

Канди
источник
Да, я знаю, но есть ли для этого какой-нибудь крючок или какой-нибудь трюк? Кстати, спасибо за информацию.
Кейур Шах
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шаблона, то вы можете сделать то же самое, но в другом шаблоне.

Zankar
источник