Magento2: เพิ่มเทมเพลตที่กำหนดเองไปยังหน้ารายละเอียดผลิตภัณฑ์ด้านล่างเพิ่มในรถเข็น


10

ฉันกำลังพยายามเพิ่มเทมเพลตที่กำหนดเองไปยังหน้าผลิตภัณฑ์ภายใต้ส่วนการแบ่งปันทางสังคม ในโมดูลของฉันฉันได้รหัสต่อไปนี้ในรูปแบบไฟล์ default.xml

 <body>
 <referenceContainer name="product.info.social">
  <block class="Magento\Framework\View\Element\Template" name="product.info.custom" template="Lapisbard_Product::social.phtml" after="product.info.addtocart">
  </block>
 </referenceContainer>
</body>

เนื้อหา social.phtml

<p>Hey there !</p>
<?php //$_product = $block->getProduct();

มันทำงานได้ดีและแสดงเนื้อหาเทมเพลตในหน้าผลิตภัณฑ์ เมื่อฉันใช้คลาสบล็อกMagento\Catalog\Block\Product\ViewแทนMagento\Framework\View\Element\Templateเพื่อให้ได้วัตถุผลิตภัณฑ์ในเทมเพลตของฉันโดยใช้$block->getProduct();มันแสดงหน้าว่าง

1. ฉันทำอะไรผิดพลาดที่นี่?
2. วิธีที่ดีที่สุดในการแก้ไขหน้าผลิตภัณฑ์คืออะไร
3. มีไฟล์รูปแบบการอ้างอิงซึ่งฉันสามารถใช้เพื่อเพิ่มเทมเพลตใหม่ในส่วนใด ๆ ของหน้าผลิตภัณฑ์ที่เขียนโค้ดเลย์เอาต์ในโมดูลของฉันได้หรือไม่?


@amiteshree อาจเป็นไฟล์ phtml ของคุณรวมถึงฟังก์ชั่นที่กำหนดไว้ใน Magento \ Catalog \ Block \ Product \ View ไฟล์บล็อก
Shaheer Ali

@ShaheerAli: ในไฟล์ phtml ของฉันฉันกำลังพยายามทำให้วัตถุผลิตภัณฑ์ใช้ $_product = $block->getProduct();เมื่อฉันใช้Magento\Catalog\Block\Product\Viewบล็อก
amitshree

ทำไมคุณจึงกำหนด Magento \ Framework \ View \ Element \ Template block ให้กับเทมเพลตของคุณ
Shaheer Ali

1
@amiteshree หากคุณต้องการใช้ฟังก์ชั่นการดูผลิตภัณฑ์คุณต้องกำหนด Magento \ Catalog \ Block \ Product \ View ให้กับเทมเพลต phtml ของคุณ และวิธีการเพิ่มเทมเพลตแบบกำหนดเองของคุณไปยังหน้าผลิตภัณฑ์นั้นถูกต้อง
Shaheer Ali

1
หน้าเปล่ามักจะหมายถึงมีข้อผิดพลาดเกิดขึ้น คุณดูใน error.log ของคุณหรือไม่ ข้อยกเว้นวีโอไอพีเข้าสู่ระบบ? คุณใช้โหมดใด
Anton Kril

คำตอบ:


24

ข้อผิดพลาด "หน้าขาว" เกิดขึ้นเพราะMagento\Framework\View\Element\Templateไม่มีgetProduct()วิธีการ

ดังนั้นฉันคิดว่าวิธีที่ "สะอาด" คือการสร้างโมดูลที่กำหนดเองด้วยบล็อกที่กำหนดเองเค้าโครงและเทมเพลต(ไม่ต้องกังวลนี่ใช้เวลาเพียงไม่กี่นาทีและคุณได้ทำบางส่วนแล้ว)

ไฟล์โมดูล:

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

(ฉันจะข้าม/etc/module.xmlและregistration.phpเพราะไม่สำคัญอย่างไรก็ตามคุณสามารถหาตัวอย่างที่สมบูรณ์ได้ที่นี่ )

เริ่มต้นด้วยไฟล์ Block php:

Test \ แคตตาล็อก \ บล็อก \ สินค้า \ ดู \ Extra.php

<?php

namespace Test\Catalog\Block\Product\View;

use Magento\Catalog\Block\Product\AbstractProduct;

class Extra extends AbstractProduct
{

}

อย่างที่คุณเห็นมันเป็นเพียงแค่ส่วนต่อขยายที่เป็นรูปธรรม (IMO) Product Abstract Block ที่เบาที่สุด คุณสามารถขยายได้Magento\Framework\View\Element\Templateแต่ในกรณีนั้นคุณจะต้องใช้getProduct()วิธีการและเปลี่ยนบริบทใน Constructor เพื่อเข้าถึงรีจิสทรี

ดังนั้นให้ย้ายไปที่ไฟล์เค้าโครง:

ทดสอบ / แคตตาล็อก / ดู / ส่วนหน้า / รูปแบบ / catalog_product_view.xml

<?xml version="1.0"?>
<body>
    <referenceContainer name="product.info.social">
        <block class="Test\Catalog\Block\Product\View\Extra"
            name="product.view.extra"
            template="Test_Catalog::product/view/extra.phtml"
            after="-">
        </block>
    </referenceContainer>
</body>

และสุดท้ายไฟล์เทมเพลต:

ทดสอบ / แคตตาล็อก / view / ส่วนหน้า / แม่ / สินค้า / view / extra.phtml

<?php /* @var $block \Test\Catalog\Block\Product\View\Extra */?>
<?php $_product = $block->getProduct() ?>
<h3><?php echo 'My Product Name Is: ' . $_product->getName(); ?></h3>

อย่างที่คุณเห็นตรงไปตรงมาเรียบง่ายกว่า M1-

โปรดจำไว้ว่าตรรกะที่กำหนดเองทั้งหมดของคุณควรนำไปใช้ในExtra.phpคลาสบล็อกเพื่อให้มุมมองสะอาด

เช่น:

ในคลาสExtra.php :

public function getSomething()
{
    return 'something'
}

ในมุมมองextra.phtml :

<?php echo $block->getSomething() ?>

2
ดังนั้นโครงร่าง catalog_product_view.xml ของโมดูลของฉันจึงโหลดโดยอัตโนมัติเมื่อฉันอยู่ในหน้าผลิตภัณฑ์?
amitshree

2
Absolutly! มันคล้ายกับ M1 มาก แต่ตอนนี้ด้ามจับทุกตัวอยู่ในไฟล์แยกกัน
MauroNigrele

5

ภาคผนวกสำหรับคำตอบที่ได้รับการยอมรับ

คำตอบที่ได้รับการยอมรับเป็นสิ่งที่ดี แต่AbstractProductจะเลิกในขณะนี้

/**
 * Class AbstractProduct
 * @api
 * @deprecated 101.1.0
 * @SuppressWarnings(PHPMD.NumberOfChildren)
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 * @since 100.0.2
 */
class AbstractProduct extends \Magento\Framework\View\Element\Template

ดังนั้นเราต้องใช้Magento\Framework\Registryเพื่อให้บรรลุบล็อก , บล็อกตัวอย่างด้านล่าง:

<?php
namespace Vendor\Module\Block;

use Magento\Framework\View\Element\Template;
use Magento\Framework\Registry;

class ProductView extends Template
{
    /**
     * @var Registry
     */
    protected $registry;

    /**
     * @var \Magento\Catalog\Model\Product
     */
    protected $product;

    /**
     * ProductView constructor.
     * @param Template\Context $context
     * @param array $data
     * @param Registry $registry
     */
    public function __construct(
        Template\Context $context,
        array $data = [],
        Registry $registry
    )
    {
        $this->registry = $registry;
        parent::__construct($context, $data);
    }

    /**
     * @return \Magento\Catalog\Model\Product
     */
    public function getProduct()
    {
        if (is_null($this->product)) {
            $this->product = $this->registry->registry('product');
        }

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