Agregar bloque personalizado en la página de listado: Magento2

10

Quiero agregar mi bloque personalizado en la página de listado [Magento-2] pero sin ninguna modificación en list.phtmlningún.phtml archivo. ¿Hay alguna posibilidad al usar el xmlarchivo?

ingrese la descripción de la imagen aquí

Cualquier ayuda será apreciada.

Keyur Shah
fuente
Gran articulo. ¿Expandiría más detalles en test.phtml para anular la página de listado original? Como soy un recién llegado en Magento 2.
¿Cómo puedo usar la función getProductDetailsHtml () para agregar el bloque 'etiqueta' NUEVO en la cuadrícula en test.phtml?
Kllee

Respuestas:

10

Puede hacerlo si crea un nuevo módulo para anular este bloque: vendor\magento\module-catalog\Block\Product\ListProduct.php

para anular este bloque, debe crear di.xmlenapp\code\Vendor\Module_Name\etc

di.xml contenido:

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

Crear nuevo nombre de archivo ListProduct.phpenapp\code\Vendor\Module_Name\Block\Product

ListProduct.php contenido:

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

Puedes cambiar el bloque Magento\Framework\View\Element\Templatea tu bloque

crear test.phtmlarchivo enapp\code\Vendor\Module_Name\view\frontend\templates

Solución de mago
fuente
Gracias por la información +1 de mi parte ... ¿Pero podemos lograrlo sin anulación?
Keyur Shah
@KeyurShah, ¿está por encima del mejor método hasta ahora en Mage 2.0 para agregar su bloque personalizado en la página de listado? También estoy de acuerdo con Kandy ya que la salida del producto está codificada en list.phtml.
Slimshadddyyy
@Vikram hasta ahora, creo que este es el mejor método hasta ahora y también está funcionando bien para mí ..
Keyur Shah
@KeyurShah, ya lo he anulado di.xmlusando el método anterior. ¿Ahora cómo mostrar el valor de mi atributo personalizado en la página de listado?
Slimshadddyyy
@Vikram puede usar el código Mageev2 para mostrar su atributo personalizado. Quiero decir que en test.phtml puedes obtener $ product object y de $ product object puedes obtener fácilmente su valor de atributo.
Keyur Shah
4

Actualmente no puede hacer esto porque toda la lógica de salida del producto está codificada en la list.phtmlplantilla.

Kandy
fuente
Sí, lo sé, pero ¿hay algún gancho o algún truco disponible para eso? Por cierto, gracias por la información.
Keyur Shah
0

Aquí está mi opinión sobre la solución, pero debe modificar la list.phtmlplantilla:

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>

En custom-block.phtmlpuedes obtener el producto así:

$_product = $block->getProduct();

Sin list.phtmlembargo, deberá sobrescribir la plantilla ... Simplemente agregue esto donde desee que se muestre su bloque personalizado:

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

Si realmente desea evitar modificar la list.phtmlplantilla, entonces puede hacer algo similar pero en una plantilla diferente.

Zankar
fuente