Додати спеціальний блок на сторінці переліку: Magento2


10

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

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

Будь-яка допомога буде вдячна.


Чудова стаття. Чи розгорнули б ви більш детальну інформацію про test.phtml, щоб замінити первісну сторінку списку? Оскільки я новий

Як я можу використати функцію getProductDetailsHtml () для додавання блоку "label" NEW у сітці в test.phtml?
Kllee

Відповіді:


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

@Vikram до цих пір, я вважаю, що це найкращий метод поки що, а також для мене добре працює ..
Кейур Шах

@KeyurShah, я вже переосмислив це за di.xmlдопомогою вищевказаного методу. Тепер, як відобразити моє спеціальне значення атрибуту на сторінці лістингу?
Slimshadddyyy

@Vikram ви можете використовувати код Mageev2 для відображення власного атрибута. Я маю на увазі в test.phtml ви можете отримати $ product object, а з $ product object ви можете легко отримати його значення атрибута.
Кейур Шах

4

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


Так, я знаю це, але чи є для цього якийсь гачок чи якийсь трюк? Btw, дякую за інформацію.
Кейр Шах

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шаблону, можливо, ви зможете зробити аналогічну річ, але в іншому шаблоні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.