ฉันต้องการเพิ่มบล็อกที่กำหนดเองของฉันในหน้ารายการ [Magento-2] แต่ไม่มีการดัดแปลงlist.phtml
ใด ๆ หรือ.phtml
ไฟล์ใด ๆ มีความเป็นไปได้xml
หรือไม่โดยใช้ไฟล์?
ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม.
ฉันต้องการเพิ่มบล็อกที่กำหนดเองของฉันในหน้ารายการ [Magento-2] แต่ไม่มีการดัดแปลงlist.phtml
ใด ๆ หรือ.phtml
ไฟล์ใด ๆ มีความเป็นไปได้xml
หรือไม่โดยใช้ไฟล์?
ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม.
คำตอบ:
คุณสามารถทำได้ถ้าคุณสร้างโมดูลใหม่เพื่อแทนที่บล็อกนี้: vendor\magento\module-catalog\Block\Product\ListProduct.php
เพื่อแทนที่บล็อกนี้คุณต้องสร้างdi.xml
ที่app\code\Vendor\Module_Name\etc
di.xml
เนื้อหา:
<?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>
สร้างชื่อไฟล์ใหม่ListProduct.php
ที่app\code\Vendor\Module_Name\Block\Product
ListProduct.php
เนื้อหา:
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 '';
}
}
คุณสามารถเปลี่ยนบล็อกเป็นบล็อกMagento\Framework\View\Element\Template
ของคุณ
สร้างtest.phtml
ไฟล์ที่app\code\Vendor\Module_Name\view\frontend\templates
di.xml
ใช้วิธีการข้างต้น ตอนนี้วิธีการแสดงค่าคุณลักษณะที่กำหนดเองของฉันในหน้ารายการ?
ขณะนี้คุณไม่สามารถทำเช่นนี้ได้เนื่องจากตรรกะทั้งหมดของเอาต์พุตผลิตภัณฑ์เป็นฮาร์ดโค้ดในlist.phtml
เทมเพลต
นี่คือวิธีการแก้ปัญหาของฉัน - แต่คุณต้องแก้ไขlist.phtml
แม่แบบ:
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>
ในcustom-block.phtml
คุณจะได้รับสินค้าเช่นนี้
$_product = $block->getProduct();
คุณจะต้องเขียนทับlist.phtml
แม่แบบแม้ว่า ... เพียงเพิ่มที่คุณต้องการให้บล็อกที่กำหนดเองของคุณแสดง:
<?php if ($customBlock = $block->getChildBlock('custom-block-container')): ?>
<?= $customBlock->setProduct($_product)->getChildHtml() ?>
<?php endif; ?>
หากคุณต้องการหลีกเลี่ยงการแก้ไขแม่แบบจริงๆlist.phtml
คุณอาจทำสิ่งที่คล้ายกัน แต่ในแม่แบบอื่น