Templat Magento 2: Gunakan `$ block` atau` $ this`?

27

Di Magento 2, $thisvariabel tidak lagi merujuk ke objek blok template. Ini merujuk ke kelas templat

 Magento\Framework\View\TemplateEngine\Php

Namun, kelas templat ini memiliki __callmetode passthrough

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

Yang memastikan setiap panggilan metode berhasil masuk ke blok sebenarnya. Ini juga menjelaskan mengapa Anda tidak dapat memanggil metode yang dilindungi dari phtmltemplate.

Selain itu, setiap templat (saya pikir?) Memiliki variabel bernama $blockpopulated, yang juga merujuk ke objek induk blok. Anda dapat melihat ini digunakan dalam template daftar Magento

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

di mana $blockvariabel digunakan, tetapi tidak pernah didefinisikan secara eksplisit.

Selain perbedaan yang disebutkan di atas, apakah ada perbedaan antara menggunakan satu teknik di atas yang lain? yaitu Melakukan keduanya $blockdan $this->currentBlockmerujuk ke objek yang sama?

Alan Storm
sumber

Jawaban:

32

Dalam file template, $blockdan $this->_currentBlockmerupakan hal yang sama.

Lihatlah rendermetode di Php.phpmesin template.
Sebelum menyertakan file templat, ini terjadi: $this->_currentBlock = $block;maka file templat disertakan menggunakan sederhana include $fileName;.
Ini berarti bahwa di dalam templat Anda masih di dalam Phpmesin templat. Itu sebabnya $thisbekerja, dan itulah mengapa $blockdidefinisikan.

[EDIT]
Saya baru tahu bahwa menggunakan $thistemplate di dalam tidak disarankan.
Sniffer php dengan standar EcgM2 menunjukkan peringatan saat menggunakan $thistemplat di dalam.
Mengganti $thisdengan $blockmembuat peringatan hilang.

Marius
sumber
Jadi yang merupakan objek default dalam file .phtml $ block atau $ this.
Manish Goswami
Apa yang Anda maksud secara default?
Marius
Apa variabel default yang digunakan dalam templat untuk mengakses kelas rendering templat? Apakah ada perbedaan antara keduanya untuk mengakses fungsi?
Manish Goswami
Dikatakan dalam jawaban ny. Keduanya bekerja tetapi dianjurkan untuk menggunakan$block
Marius
5

Sejauh yang saya lihat mereka berdua hampir sama di PHP TemplateEngineInterface, tetapi ingat bahwa di Magento2 Anda dapat membuat mesin templat kustom. Tidak seperti Magento1 di mana Anda baru saja memiliki file phtml.

Jika Anda melihat TemplateEngineInterfaceAnda tidak dapat melihat referensi ke metode apa pun yang memanggil currentBlock, jadi saya pikir $this->currentBlockpendekatannya adalah templat PHP khusus.

Tetapi untuk menjadi independen dari mesin templat, $blockharus pendekatan yang benar.

Maksud saya, dari sudut pandang teoretis, Anda dapat membuat mesin berbasis PHP yang berbeda yang tidak dapat mengandalkan file phtml, tetapi mungkin pada beberapa struktur PHP lainnya.

Saya menganggap $blocksebagai cara "benar" untuk mode "phtml" karena secara eksplisit dilewatkan sebagai variabel konteks.

$blockdan $this->currentBlocksama dari sudut pandang teknis, tetapi jika mereka menggunakan secara eksplisit $blocksaya pikir kita harus menggunakannya, dari sudut pandang kode-styling.

Phoenix128_RiccardoT
sumber
Tetapi $ block bukan bagian dari antarmuka. Saya akan mengatakan aman untuk menganggap bahwa implementasi ini digunakan ketika Anda berada di dalam file phtml. Implementasi lain tidak akan menggunakan file phtml.
Fabian Schmengler
Anda benar, saya belum jelas dalam jawaban saya untuk menjelaskan apa yang saya maksud. Saya memodifikasi posting saya dengan lebih detail.
Phoenix128_RiccardoT