Quiero agregar mi bloque personalizado en la página de listado [Magento-2] pero sin ninguna modificación en list.phtml
ningún.phtml
archivo. ¿Hay alguna posibilidad al usar el xml
archivo?
Cualquier ayuda será apreciada.
Quiero agregar mi bloque personalizado en la página de listado [Magento-2] pero sin ninguna modificación en list.phtml
ningún.phtml
archivo. ¿Hay alguna posibilidad al usar el xml
archivo?
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.xml
enapp\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.php
enapp\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\Template
a tu bloque
crear test.phtml
archivo enapp\code\Vendor\Module_Name\view\frontend\templates
di.xml
usando 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.phtml
plantilla.
Aquí está mi opinión sobre la solución, pero debe modificar la list.phtml
plantilla:
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.phtml
puedes obtener el producto así:
$_product = $block->getProduct();
Sin list.phtml
embargo, 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.phtml
plantilla, entonces puede hacer algo similar pero en una plantilla diferente.