Dodaj niestandardowy blok na stronie aukcji: Magento2

10

Chcę dodać własny blok na stronie z listą [Magento-2], ale bez żadnych modyfikacji list.phtmlani żadnego.phtml pliku. Czy jest jakaś możliwość za pomocą xmlpliku?

wprowadź opis zdjęcia tutaj

Każda pomoc będzie mile widziana.

Keyur Shah
źródło
Świetny artykuł. Czy rozwinąłbyś więcej szczegółów na test.phtml, aby zastąpić oryginalną stronę z listą? Jak jestem nowy na Magento 2.
Jak mogę użyć funkcji getProductDetailsHtml () do dodania bloku „etykieta” NOWOŚĆ na siatce w test.phtml?
Kllee

Odpowiedzi:

10

Możesz to zrobić, jeśli utworzysz nowy moduł, aby zastąpić ten blok: vendor\magento\module-catalog\Block\Product\ListProduct.php

aby zastąpić ten blok, musisz utworzyć di.xmlwapp\code\Vendor\Module_Name\etc

di.xml zadowolony:

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

Utwórz nową nazwę pliku ListProduct.phpnaapp\code\Vendor\Module_Name\Block\Product

ListProduct.php zadowolony:

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

Możesz zmienić blok Magento\Framework\View\Element\Templatena swój blok

utwórz test.phtmlplik oapp\code\Vendor\Module_Name\view\frontend\templates

Rozwiązanie dla magów
źródło
Dzięki za informacje ode mnie +1 ... Ale czy możemy to osiągnąć bez przesłonięcia?
Keyur Shah
@KeyurShah, czy jest powyżej najlepszej metody w Mage 2.0, aby dodać własny blok na stronie listy? Zgadzam się również z Kandy, ponieważ dane wyjściowe produktu są zapisane na stałe w pliku list.phtml.
Slimshadddyyy
@Vikram do tej pory, myślę, że jest to najlepsza jak dotąd metoda, która również działa dobrze dla mnie ..
Keyur Shah
@KeyurShah, już przesłoniłem to przy di.xmlużyciu powyższej metody. Jak wyświetlić moją niestandardową wartość atrybutu na stronie z listą?
Slimshadddyyy
@Vikram możesz użyć kodu Mageev2, aby wyświetlić swój niestandardowy atrybut. Mam na myśli, że w test.phtml można uzyskać obiekt $ product, a z obiektu $ product można łatwo uzyskać jego wartość atrybutu.
Keyur Shah
4

Obecnie nie można tego zrobić, ponieważ cała logika produktu wyjściowego jest zapisana w list.phtmlszablonie.

KAndy
źródło
Tak, wiem że ,, Ale czy jest do tego jakiś haczyk lub jakaś sztuczka? Btw, dzięki za informację.
Keyur Shah
0

Oto moje zdanie na temat rozwiązania - ale musisz zmodyfikować list.phtmlszablon:

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>

W custom-block.phtmlmożna uzyskać produkt jak ten:

$_product = $block->getProduct();

Musisz jednak zastąpić list.phtmlszablon ... Po prostu dodaj to w miejscu, w którym chcesz, aby niestandardowy blok wyświetlał:

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

Jeśli naprawdę chcesz uniknąć modyfikacji list.phtmlszablonu, możesz być w stanie zrobić coś podobnego, ale używając innego szablonu.

Zankar
źródło