Adicionar bloco personalizado na página de listagem: Magento2

10

Quero adicionar meu bloco personalizado na página de listagem [Magento-2], mas sem nenhuma modificação list.phtmlou.phtml arquivo. Existe alguma possibilidade usando o xmlarquivo?

insira a descrição da imagem aqui

Qualquer ajuda será apreciada.

Keyur Shah
fonte
Ótimo artigo. Você expandiria mais detalhes em test.phtml para substituir a página de listagem original? Como eu sou um novato no Magento 2.
Como posso usar a função getProductDetailsHtml () para adicionar o bloco 'label' NEW na grade em test.phtml?
Kllee

Respostas:

10

Você pode fazer isso se criar um novo módulo para substituir este bloco: vendor\magento\module-catalog\Block\Product\ListProduct.php

para substituir esse bloco, você precisa criar di.xmlemapp\code\Vendor\Module_Name\etc

di.xml conteúdo:

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

Crie um novo nome de arquivo ListProduct.phpemapp\code\Vendor\Module_Name\Block\Product

ListProduct.php conteúdo:

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

Você pode alterar o bloco Magento\Framework\View\Element\Templatepara o seu bloco

criar test.phtmlarquivo emapp\code\Vendor\Module_Name\view\frontend\templates

Solução Mage
fonte
Obrigado pela informação +1 de mim ... Mas podemos alcançar sem substituir?
Keyur Shah
@KeyurShah, está acima do melhor método até agora no Mage 2.0 para adicionar seu bloco personalizado na página de listagem? Também concordo com Kandy, pois a saída do produto é codificada no list.phtml.
Slimshadddyyy
@Vikram até agora, acho que este é o melhor método até agora e também está trabalhando muito bem para mim ..
Keyur Shah
@KeyurShah, eu já superei isso di.xmlusando o método acima. Agora, como exibir meu valor de atributo personalizado na página de listagem?
Slimshadddyyy 9/02/16
@ Vikram, você pode usar o código Mageev2 para exibir seu atributo personalizado. Quero dizer que em test.phtml você pode obter $ product object e em $ product object você pode obter facilmente seu valor de atributo.
Keyur Shah
4

Atualmente, você não pode fazer isso porque toda a lógica da saída do produto é codificada no list.phtmlmodelo.

KAndy
fonte
Sim, eu sei disso ... Mas há algum truque ou truque disponível para isso? Btw, obrigado pela informação.
Keyur Shah
0

Aqui está minha opinião sobre a solução - mas você deve modificar o list.phtmlmodelo:

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>

Em custom-block.phtmlvocê pode obter o produto como este:

$_product = $block->getProduct();

Você precisará sobrescrever o list.phtmlmodelo ... Basta adicionar isto onde deseja que seu bloco personalizado seja exibido:

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

Se você realmente deseja evitar modificar o list.phtmlmodelo, poderá fazer algo semelhante, mas em um modelo diferente.

Zankar
fonte