Magento 2 टेम्प्लेट: `$ ब्लॉक` या` $ इस` का उपयोग करें?


27

Magento 2 में, $thisचर अब किसी टेम्प्लेट के ब्लॉक ऑब्जेक्ट को संदर्भित नहीं करता है। यह एक टेम्पलेट वर्ग को संदर्भित करता है

 Magento\Framework\View\TemplateEngine\Php

हालाँकि, इस टेम्प्लेट क्लास में एक pststhrough __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आबादी वाला एक चर नाम है , जो मूल ब्लॉक ऑब्जेक्ट को भी संदर्भित करता है। आप इसका उपयोग Magento के सूची टेम्पलेट में देख सकते हैं

#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 मानकों के साथ php स्निफर $thisअंदर के टेम्प्लेट का उपयोग करते समय एक चेतावनी दिखाता है ।
के $thisसाथ बदलने $blockसे चेतावनी चली जाती है।


तो जो .phtml फ़ाइल में डिफ़ॉल्ट ऑब्जेक्ट है, वह $ ब्लॉक या $ है।
मनीष गोस्वामी

क्या आप डिफ़ॉल्ट रूप से मतलब है?
मेरियस

टेम्प्लेट के रेंडरिंग क्लास तक पहुंचने के लिए टेम्प्लेट में उपयोग किया जाने वाला डिफ़ॉल्ट वैरिएबल क्या है? क्या फंक्शन तक पहुंचने के लिए इन दोनों में कोई अंतर है?
मनीष गोस्वामी

यह ny जवाब में कहते हैं। काम, लेकिन यह उपयोग करने के लिए सिफारिश की है दोनों$block
मेरियस

5

जहाँ तक मैंने देखा है कि वे दोनों पीएचपी टेम्पलेटप्लाइनइंटरफेस में लगभग समान हैं, लेकिन याद रखें कि Magento2 में आप कस्टम टेम्पलेट इंजन बना सकते हैं। उस Magento1 की तरह नहीं, जिसमें आपके पास सिर्फ phtml फाइलें थीं।

यदि आप देखते हैं कि TemplateEngineInterfaceआप किसी भी विधि को कॉल करने के लिए कोई संदर्भ नहीं देख सकते हैं currentBlock, तो मुझे लगता है कि $this->currentBlockदृष्टिकोण PHP टेम्पलेट विशिष्ट है।

लेकिन टेम्पलेट इंजन से स्वतंत्र होने के लिए, $blockसही दृष्टिकोण होना चाहिए।

मेरा मतलब है कि, सैद्धांतिक दृष्टिकोण से, आप एक अलग PHP आधारित इंजन बना सकते हैं जो phtml फ़ाइलों पर भरोसा नहीं कर सकता है, लेकिन शायद कुछ अन्य PHP संरचना पर।

मैं $block"phtml" मोड के लिए "सही" तरीका मानता हूं क्योंकि यह स्पष्ट रूप से संदर्भ चर के रूप में पारित किया गया है।

$blockऔर $this->currentBlockतकनीकी दृष्टिकोण से समान हैं, लेकिन अगर वे $blockसोच- समझकर इस्तेमाल करते हैं तो मुझे लगता है कि हमें इसका उपयोग कोड-स्टाइलिंग दृष्टिकोण से करना चाहिए।


लेकिन न तो इंटरफ़ेस का $ ब्लॉक हिस्सा है। मैं कहता हूं कि यह मान लेना सुरक्षित है कि जब आप phtml फ़ाइल के अंदर होते हैं तो इस कार्यान्वयन का उपयोग किया जाता है। अन्य कार्यान्वयन phtml फ़ाइल का उपयोग नहीं करेंगे।
फेबियन शेंगलर

आप सही हैं, मैं अपने उत्तर में स्पष्ट नहीं कर पाया कि मुझे क्या मतलब है। मैंने अधिक विवरण के साथ अपनी पोस्ट को संशोधित किया।
फीनिक्स128_रीकॉर्डो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.