เทมเพลต Magento 2: ใช้ `$ block` หรือ` $ this`?


27

ใน Magento 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เติมซึ่งยังหมายถึงวัตถุบล็อกผู้ปกครอง คุณสามารถดูสิ่งนี้ได้ในแม่แบบรายการของ 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แม่แบบภายในนั้นไม่ได้รับการสนับสนุน
php ดมกลิ่นด้วยมาตรฐาน EcgM2 แสดงคำเตือนเมื่อใช้$thisภายในแม่แบบ
การแทนที่$thisด้วย$blockทำให้การเตือนหมดไป


ดังนั้นซึ่งเป็นวัตถุเริ่มต้นใน. ไฟล์ HTML บล็อก $ หรือ $ นี้
Manish Goswami

คุณหมายถึงอะไรโดยปริยาย?
Marius

อะไรคือตัวแปรเริ่มต้นที่ใช้ในเทมเพลตเพื่อเข้าถึงคลาสการแสดงผลของเทมเพลต ฟังก์ชั่นการเข้าถึงฟังก์ชั่นนี้แตกต่างกันหรือไม่?
Manish Goswami

มันบอกว่าในคำตอบ ny ทั้งงาน แต่แนะนำให้ใช้$block
Marius

5

เท่าที่ฉันเคยเห็นพวกเขาทั้งคู่เกือบจะเหมือนกันใน PHP TemplateEngineInterface แต่จำไว้ว่าใน Magento2 คุณสามารถสร้างเครื่องมือเทมเพลตที่กำหนดเองได้ ไม่เหมือน Magento1 ที่คุณเพิ่งมีไฟล์ phtml

หากคุณเห็นว่าTemplateEngineInterfaceคุณไม่เห็นการอ้างอิงใด ๆ กับวิธีการใด ๆ ที่เรียกcurrentBlockดังนั้นฉันคิดว่า$this->currentBlockวิธีนี้เป็นเทมเพลต PHP เฉพาะ

แต่เพื่อที่จะเป็นอิสระจากเครื่องมือแม่แบบ$blockควรเป็นวิธีที่ถูกต้อง

ฉันหมายความว่าจากมุมมองทางทฤษฎีคุณสามารถสร้างเอนจิ้น PHP ที่แตกต่างกันซึ่งไม่สามารถพึ่งพาไฟล์ phtml แต่อาจจะอยู่ในโครงสร้าง PHP อื่น ๆ

ฉันถือว่า$blockเป็นวิธี "ถูกต้อง" สำหรับโหมด "phtml" เพราะมันถูกส่งผ่านอย่างชัดเจนเป็นตัวแปรบริบท

$blockและ$this->currentBlockเหมือนกันจากมุมมองทางเทคนิค แต่ถ้าพวกเขาใช้อย่างชัดเจน$blockฉันคิดว่าเราควรใช้มันจากมุมมองของการกำหนดรหัส


แต่ไม่ใช่ $ block ส่วนหนึ่งของอินเทอร์เฟซ ฉันว่ามันปลอดภัยที่จะสมมติว่าการใช้งานนี้จะใช้เมื่อคุณอยู่ในไฟล์ phtml การใช้งานอื่น ๆ จะไม่ใช้ไฟล์ phtml
เฟเบียน Schmengler

คุณพูดถูกฉันไม่ชัดเจนในคำตอบที่จะอธิบายว่าฉันหมายถึงอะไร ฉันแก้ไขโพสต์ด้วยรายละเอียดเพิ่มเติม
Phoenix128_RiccardoT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.