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 \ Product \ Block फाइल में परिभाषित हैं
Shaheer Ali

@ शेहरअली: मेरी phtml फ़ाइल में, $_product = $block->getProduct();जब मैं Magento\Catalog\Block\Product\Viewब्लॉक का उपयोग कर रहा हूं, तो मैं उत्पाद ऑब्जेक्ट प्राप्त करने की कोशिश कर रहा हूं ।
अमृतश्री

तो फिर आप अपने टेम्प्लेट में Magento \ Framework \ View \ Element \ Template ब्लॉक क्यों असाइन कर रहे हैं।
शहीर अली

1
@amiteshree यदि आप उत्पाद दृश्य फ़ंक्शंस का उपयोग करना चाहते हैं तो आपको अपने टेम्पलेट phtml में Magento \ कैटलॉग \ Block \ Product \ View निर्दिष्ट करने की आवश्यकता है। और उत्पाद पृष्ठ पर कस्टम टेम्पलेट जोड़ने की आपकी विधि सही है
शहीर अली

1
खाली पृष्ठ का आमतौर पर मतलब होता है, कुछ त्रुटि हुई। क्या आपने अपनी त्रुटि देखी है। Magento अपवाद लॉग? आप किस मोड का उपयोग करते हैं?
एंटोन क्रिल

जवाबों:


24

"सफेद पृष्ठ" त्रुटि आती है क्योंकि Magento\Framework\View\Element\Templateकोई getProduct()विधि नहीं है ।

इसलिए मुझे लगता है कि ऐसा करने का "सबसे साफ" तरीका कस्टम ब्लॉक, लेआउट और टेम्पलेट के साथ एक कस्टम मॉड्यूल बनाना है (यह चिंता न करें कि बस कुछ मिनट लगते हैं और आपने कुछ हिस्से किए हैं)

मॉड्यूल फ़ाइलें:

यहाँ छवि विवरण दर्ज करें

(मैं छोड़ दूंगा /etc/module.xmlऔर registration.phpक्योंकि आप तुच्छ हैं, हालांकि आपको यहां पूरा उदाहरण मिल सकता है ।)

ब्लॉक php फ़ाइल के साथ शुरू करते हैं:

टेस्ट \ सूची \ ब्लॉक \ उत्पाद \ देखें \ Extra.php

<?php

namespace Test\Catalog\Block\Product\View;

use Magento\Catalog\Block\Product\AbstractProduct;

class Extra extends AbstractProduct
{

}

जैसा कि आप देख सकते हैं कि यह केवल एक ठोस वर्ग (IMO) सबसे हल्का उत्पाद सार ब्लॉक है। आप विस्तार भी कर सकते हैं Magento\Framework\View\Element\Templateलेकिन उस स्थिति में आपको getProduct()रजिस्ट्री तक पहुँच प्राप्त करने के लिए विधि को लागू करने और निर्माणकर्ता में संदर्भ बदलने की आवश्यकता होगी ।

तो आपको लेआउट फ़ाइल में ले जाने देता है:

टेस्ट / सूची / देखने / दृश्यपटल / लेआउट / 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>

और अंत में टेम्पलेट फ़ाइल:

टेस्ट / सूची / देखें / दृश्यपटल / टेम्पलेट्स / उत्पाद / देखें / 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>

जैसा कि आप देख सकते हैं कि एम 1 की तुलना में बहुत सरल, सरल है-

याद रखें कि Extra.phpदृश्य को साफ रखने के लिए आपके सभी कस्टम तर्क को ब्लॉक वर्ग में लागू किया जाना चाहिए ।

अर्थात:

में Extra.php वर्ग:

public function getSomething()
{
    return 'something'
}

में extra.phtml दृश्य:

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

2
जब मैं उत्पाद पृष्ठ पर होता हूं तो मेरे मॉड्यूल का कैटलॉग_प्रोडक्ट_व्यू.एक्सएमएल लेआउट स्वचालित रूप से लोड होता है?
अमृतश्री २ '

2
Absolutly! यह M1 के समान है, लेकिन अब हर हैंडल एक अलग फाइल में है।
मौरोनिग्रेले

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;
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.