Magento 2 টেমপ্লেট: `$ block$ বা` $ this` ব্যবহার করবেন?


27

ম্যাজেন্টো 2-এ, $thisভেরিয়েবলটি আর কোনও টেমপ্লেটের ব্লক অবজেক্টে রেফার করে না। এটি একটি টেম্পলেট শ্রেণি বোঝায়

 Magento\Framework\View\TemplateEngine\Php

যাইহোক, এই টেমপ্লেট শ্রেণীর একটি পাসথ্রু __callপদ্ধতি রয়েছে

#File: vendor/magento/framework/View/TemplateEngine/Php.php
public function __call($method, $args)
{
    return call_user_func_array([$this->_currentBlock, $method], $args);
}

যা নিশ্চিত করে যে কোনও পদ্ধতির কলগুলি এটিকে আসল ব্লকের মাধ্যমে করে। আপনি phtmlটেমপ্লেটগুলি থেকে সুরক্ষিত পদ্ধতিগুলিকে কেন কল করতে পারবেন না তা এটিও ব্যাখ্যা করে ।

এই যদিও ছাড়াও, যে (আমার ধারণা?) টেমপ্লেট নামে একটি পরিবর্তনশীল হয়েছে $blockজনবহুল, যা এছাড়াও পিতা বা মাতা ব্লক বস্তুর বোঝায়। আপনি এটি ম্যাজেন্টোর তালিকার টেম্পলেটটিতে ব্যবহারে দেখতে পারেন

#File: vendor/magento/module-catalog/view/frontend/templates/product/list.phtml
//...
$_productCollection = $block->getLoadedProductCollection();

যেখানে $blockভেরিয়েবল ব্যবহার করা হয় তবে কখনও স্পষ্টভাবে সংজ্ঞায়িত হয় না।

উপরে বর্ণিত পার্থক্যগুলি বাদে অন্য একটি কৌশল ব্যবহারের মধ্যে কী কোনও পার্থক্য রয়েছে? অর্থাত দো উভয় $blockএবং $this->currentBlockএকই বস্তুর পড়ুন?

উত্তর:


32

একটি টেমপ্লেট ফাইলে $blockএবং $this->_currentBlockএকই জিনিস।

টেম্পলেট ইঞ্জিনের renderপদ্ধতিটি একবার দেখুন Php.php
টেমপ্লেট ফাইল অন্তর্ভুক্ত করার আগে, এটি ঘটে: $this->_currentBlock = $block;তারপরে টেমপ্লেট ফাইলটি একটি সাধারণ ব্যবহার করে অন্তর্ভুক্ত করা হবে include $fileName;
এর অর্থ এই যে কোনও টেম্পলেটটির অভ্যন্তরে আপনি এখনও Phpটেম্পলেট ইঞ্জিনের মধ্যে রয়েছেন । এজন্যই $thisকাজ করে এবং এজন্য $blockসংজ্ঞায়িত হয়।

[সম্পাদনা]
আমি সবেমাত্র জানতে পেরেছি যে $thisঅভ্যন্তরীণ টেম্পলেটগুলি ব্যবহার করা নিরুৎসাহিত করা হয়েছে।
EcgM2 স্ট্যান্ডার্ড সহ পিএইচপি স্নিফার $thisভিতরে টেম্পলেট ব্যবহার করার সময় একটি সতর্কতা দেখায় ।
প্রতিস্থাপন করা হচ্ছে $thisসঙ্গে $blockতোলে সাবধানবাণী দূরে যান।


সুতরাং .phtml ফাইল default ব্লক বা $ এটিতে ডিফল্ট অবজেক্ট।
মণীশ গোস্বামী

ডিফল্ট বলতে কী বোঝ?
মারিয়াস

টেমপ্লেটের রেন্ডারিং ক্লাস অ্যাক্সেস করতে কোনও টেমপ্লেটে ব্যবহৃত ডিফল্ট ভেরিয়েবল কী? অ্যাক্সেস অ্যাক্সেসে এই দুটির মধ্যে কোনও পার্থক্য আছে কি?
মণীশ গোস্বামী

এটা উত্তর উত্তর। উভয়ই কাজ করে তবে এটি ব্যবহার করার প্রস্তাব দেওয়া হয়$block
মারিয়াস

5

যতদূর আমি দেখেছি তারা দুজনেই পিএইচপি টেম্পলেটজিনইন্টারফেসে প্রায় একই, তবে মনে রাখবেন যে Magento2 এ আপনি কাস্টম টেম্পলেট ইঞ্জিন তৈরি করতে পারেন। Magento1 এর মতো নয় যেখানে আপনার সবেমাত্র পিএইচটিএমএল ফাইল ছিল।

আপনি যদি দেখেন যে TemplateEngineInterfaceআপনি কল করার কোনও পদ্ধতির কোনও রেফারেন্স দেখতে পাচ্ছেন না currentBlock, সুতরাং আমি মনে করি $this->currentBlockপন্থাটি পিএইচপি টেম্পলেট নির্দিষ্ট।

তবে টেমপ্লেট ইঞ্জিন থেকে স্বতন্ত্র $blockহওয়ার জন্য সঠিক পদ্ধতির হওয়া উচিত।

আমার অর্থ, তাত্ত্বিক দৃষ্টিকোণ থেকে, আপনি একটি পৃথক পিএইচপি ভিত্তিক ইঞ্জিন তৈরি করতে পারেন যা পিএইচটিএমএল ফাইলগুলির উপর নির্ভর করতে পারে না, তবে সম্ভবত অন্য কোনও পিএইচপি কাঠামোর উপর।

আমি $block"পিএইচটিএমএল" মোডের "ডান" উপায় হিসাবে ধরে নিয়েছি কারণ এটি প্রাসঙ্গিক ভেরিয়েবল হিসাবে স্পষ্টভাবে পাস করা হয়েছে।

$blockএবং $this->currentBlockপ্রযুক্তিগত দৃষ্টিকোণ থেকে একই, তবে তারা যদি স্পষ্টভাবে ব্যবহার করে তবে $blockআমি মনে করি আমাদের কোড-স্টাইলিং দৃষ্টিকোণ থেকে এটি ব্যবহার করা উচিত।


তবে উভয়ই ইন্টারফেসের $ ব্লক অংশ নয়। আমি বলব যে আপনি যখন কোনও পিএইচটিএমএল ফাইলের অভ্যন্তরে থাকবেন তখন এই প্রয়োগটি ব্যবহৃত হয়। অন্যান্য বাস্তবায়নগুলি পিএইচটিএমএল ফাইল ব্যবহার করবে না।
ফ্যাবিয়ান শেমঙ্গলার

আপনি ঠিক বলেছেন, আমি কী বলতে চাইছি তা ব্যাখ্যা করার জন্য আমি আমার উত্তরে পরিষ্কার ছিলাম না। আমি আরও বিশদ সহ আমার পোস্টটি পরিবর্তন করেছি।
ফিনিক্স 128_ রিকার্ডোটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.