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?
Cualquier ayuda será apreciada.
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?
Cualquier ayuda será apreciada.
Respuestas:
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
di.xmlusando el método anterior. ¿Ahora cómo mostrar el valor de mi atributo personalizado en la página de listado?
Actualmente no puede hacer esto porque toda la lógica de salida del producto está codificada en la list.phtmlplantilla.
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.