เพิ่มบล็อกที่กำหนดเองในหน้ารายการ: Magento2


10

ฉันต้องการเพิ่มบล็อกที่กำหนดเองของฉันในหน้ารายการ [Magento-2] แต่ไม่มีการดัดแปลงlist.phtmlใด ๆ หรือ.phtmlไฟล์ใด ๆ มีความเป็นไปได้xmlหรือไม่โดยใช้ไฟล์?

ป้อนคำอธิบายรูปภาพที่นี่

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม.


บทความดีๆ คุณจะขยายรายละเอียดเพิ่มเติมใน test.phtml เพื่อแทนที่หน้ารายชื่อเดิมหรือไม่ เนื่องจากฉันเป็นผู้มาใหม่ใน Magento 2

ฉันจะใช้ฟังก์ชั่น getProductDetailsHtml () เพื่อเพิ่ม block 'label' ใหม่ใน grid ได้อย่างไรใน test.phtml
Kllee

คำตอบ:


10

คุณสามารถทำได้ถ้าคุณสร้างโมดูลใหม่เพื่อแทนที่บล็อกนี้: 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


ขอบคุณสำหรับข้อมูล +1 จากฉัน ... แต่เราจะประสบความสำเร็จได้โดยปราศจากการแทนที่?
Keyur Shah

@KeyurShah อยู่เหนือวิธีที่ดีที่สุดใน Mage 2.0 เพื่อเพิ่มบล็อกที่กำหนดเองของคุณในหน้ารายการ? ฉันยังเห็นด้วยกับแคนดี้เนื่องจากผลผลิตของผลิตภัณฑ์ถูกเข้ารหัสใน list.phtml
Slimshadddyyy

@Vikram จนถึงตอนนี้ฉันคิดว่านี่เป็นวิธีที่ดีที่สุดจนถึงตอนนี้และก็ทำงานได้ดีสำหรับฉัน ..
Keyur Shah

@KeyurShah ฉันมี overriddien แล้วด้วยการdi.xmlใช้วิธีการข้างต้น ตอนนี้วิธีการแสดงค่าคุณลักษณะที่กำหนดเองของฉันในหน้ารายการ?
Slimshadddyyy

@Vikram คุณสามารถใช้รหัส Mageev2 เพื่อแสดงแอตทริบิวต์ที่กำหนดเองของคุณ ฉันหมายถึงใน test.phtml คุณสามารถรับ $ วัตถุผลิตภัณฑ์และจาก $ วัตถุผลิตภัณฑ์คุณสามารถรับค่าคุณลักษณะได้อย่างง่ายดาย
Keyur Shah

4

ขณะนี้คุณไม่สามารถทำเช่นนี้ได้เนื่องจากตรรกะทั้งหมดของเอาต์พุตผลิตภัณฑ์เป็นฮาร์ดโค้ดในlist.phtmlเทมเพลต


ใช่ฉันรู้ว่า แต่มีตะขอหรือเคล็ดลับใด ๆ ที่มีอยู่หรือไม่ Btw ขอบคุณสำหรับข้อมูล
Keyur Shah

0

นี่คือวิธีการแก้ปัญหาของฉัน - แต่คุณต้องแก้ไข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คุณอาจทำสิ่งที่คล้ายกัน แต่ในแม่แบบอื่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.