Magento2: নীচে পণ্য বিবরণ পৃষ্ঠাতে কাস্টম টেম্পলেট যুক্ত করুন কার্ট বিভাগে যুক্ত করুন


10

আমি সামাজিক ভাগ করে নেওয়ার বিভাগের অধীনে পণ্য পৃষ্ঠাতে কাস্টম টেম্পলেট যুক্ত করার চেষ্টা করছি। আমার মডিউলে আমি লেআউট ফাইল ডিফল্ট.এক্সএমএল কোড অনুসরণ করেছি

 <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();, এটি একটি ফাঁকা পৃষ্ঠা দেখাচ্ছে।

আমি এখানে কোন ভুল করছি?
2. পণ্য পৃষ্ঠা পরিবর্তন করার সর্বোত্তম উপায় কী?
৩. আমার মডিউলে প্রোডাক্ট পৃষ্ঠা রাইটিং লেআউট কোডের যে কোনও বিভাগে নতুন টেমপ্লেট যুক্ত করতে আমি ব্যবহার করতে পারি এমন একটি রেফারেন্স লেআউট ফাইল আছে?


@ মমিতশ্রী হতে পারে আপনার পিটিএইচটিএমএল ফাইলের মধ্যে ম্যাংটো \ ক্যাটালগ \ ব্লক \ পণ্য \ ব্লক ফাইলটি সংজ্ঞায়িত ফাংশনগুলি অন্তর্ভুক্ত থাকতে পারে
শাহির আলী

@ শাহিরআলি: আমার পিএইচটিএমএল ফাইলে আমি ব্লকটি ব্যবহার করার $_product = $block->getProduct();সময় পণ্য অবজেক্টটি ব্যবহার করার চেষ্টা করছি Magento\Catalog\Block\Product\View
অমিতশ্রী

তাহলে আপনি কেন আপনার টেমপ্লেটে ম্যাজেন্টো \ ফ্রেমওয়ার্ক \ ভিউ \ এলিমেন্ট \ টেম্পলেট ব্লক বরাদ্দ করছেন।
শাহির আলী

1
@ অমিতাশ্রী আপনি যদি পণ্য দর্শন ফাংশন ব্যবহার করতে চান তবে আপনাকে আপনার টেমপ্লেট পিএইচটিএমএলকে ম্যাজেন্টো \ ক্যাটালগ \ ব্লক \ পণ্য \ ভিউ নিয়োগ করতে হবে। এবং আপনার পণ্য পৃষ্ঠাতে কাস্টম টেম্পলেট যুক্ত করার পদ্ধতিটি সঠিক
শাহির আলি

1
খালি পৃষ্ঠাটির অর্থ সাধারণত, কিছু ত্রুটি ঘটেছে। আপনি কি আপনার ত্রুটিটি দেখেছেন? ব্লগ লম্বা লম্বা ম্যাজেন্টো? আপনি কোন মোড ব্যবহার করেন?
আন্তন ক্রিল

উত্তর:


24

"সাদা পৃষ্ঠা" ত্রুটিটি আসে কারণ Magento\Framework\View\Element\Templateকোনও getProduct()পদ্ধতি নেই।

সুতরাং আমি মনে করি এটি করার জন্য "পরিষ্কারতম" উপায়টি একটি কাস্টম ব্লক, লেআউট এবং টেম্পলেট সহ একটি কাস্টম মডিউল তৈরি করা (এটি কয়েক মিনিট সময় নেয় এবং আপনি কিছু অংশ সম্পন্ন করেছেন তা চিন্তা করবেন না)

মডিউল ফাইল:

এখানে চিত্র বর্ণনা লিখুন

(আমি এড়িয়ে যাব /etc/module.xmlএবং registration.phpকারণ তুচ্ছ, তবে আপনি এখানে পুরো উদাহরণটি খুঁজে পেতে পারেন ))

ব্লক পিএইচপি ফাইল দিয়ে শুরু করা যাক:

টেস্ট \ ক্যাটালগ \ ব্লক \ পণ্যের \ দেখুন \ Extra.php

<?php

namespace Test\Catalog\Block\Product\View;

use Magento\Catalog\Block\Product\AbstractProduct;

class Extra extends AbstractProduct
{

}

আপনি দেখতে পাচ্ছেন এটি কেবলমাত্র একটি কংক্রিট শ্রেণি প্রসারিত (আইএমও) সর্বাধিক লাইটওয়েট পণ্য অ্যাবস্ট্রাক ব্লক। আপনি প্রসারিতও করতে পারেন 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! এটি এম 1 এর সাথে খুব সমান তবে এখন প্রতিটি হ্যান্ডেল পৃথক ফাইলে।
মাউরোনিগ্রিল

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.