Magento 2 Şablonları: `$ block` ya da` this this?


27

Magento 2'de, $thisdeğişken artık bir şablonun blok nesnesine atıfta bulunmaz. Bir şablon sınıfını ifade eder.

 Magento\Framework\View\TemplateEngine\Php

Bununla birlikte, bu şablon sınıfının bir geçiş __callyöntemi vardır

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

Herhangi bir yöntem çağrısının gerçek bloğa ulaşmasını sağlayan bu. Bu ayrıca, neden korunan yöntemleri phtmlşablonlardan arayamadığınızı da açıklar .

Buna ek olarak, her (bence?) Şablonun üst blok nesnesini de ifade eden, $blockpopülasyon adında bir değişken vardır . Bunu Magento'nun liste şablonunda görebilirsiniz.

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

nerede $blockdeğişken kullanılır, ancak açıkça tanımlanmış hiçbir zaman.

Yukarıda belirtilen farklılıklar dışında, bir tekniği diğerine göre kullanmak arasında bir fark var mı? yani Do hem $blockve $this->currentBlockaynı nesneyi?

Yanıtlar:


32

Bir şablon dosyasında $blockve $this->_currentBlockaynı şey.

Şablon motorundaki renderyönteme bir göz atın Php.php.
Şablon dosyasını dahil etmeden önce, bu olur: $this->_currentBlock = $block;sonra şablon dosyası basit kullanılarak eklenir include $fileName;.
Bu araçlar bir şablonu içinde sen hala içeride Phpşablon motoru. Bu yüzden $thisişe yarıyor ve bu yüzden $blocktanımlanıyor.

[EDIT]
Sadece $thisiçindeki şablonları kullanmanın yasak olduğunu öğrendim .
EcgM2 standartlarına sahip php sniffer, $thisiç şablonları kullanırken bir uyarı gösterir .
Değiştirme $thisile $blockuyarı gitmesini yapar.


Yani .phtml dosyasındaki varsayılan nesne $ block veya $ this.
Manish Goswami,

Varsayılan olarak ne demek istiyorsunuz?
Marius

Şablonun oluşturma sınıfına erişmek için şablonda kullanılan varsayılan değişken nedir? Erişim fonksiyonu için bu ikisinin arasında herhangi bir fark var mı?
Manish Goswami

Cevap yok diyor. İş ama kullanılması önerilir Hem$block
Marius

5

Gördüğüm kadarıyla her ikisi de PHP TemplateEngineInterface'te neredeyse aynıdır, ancak Magento2'de özel şablon motorları oluşturabileceğinizi unutmayın. Sadece phtml dosyalarının bulunduğu Magento1 gibi değil.

Gördüğünüz takdirde, TemplateEngineInterfaceonu çağıran herhangi bir yönteme referans göremezsiniz currentBlock, bu yüzden $this->currentBlockyaklaşımın PHP şablonuna özgü olduğunu düşünüyorum .

Ancak şablon motordan bağımsız $blockolabilmek için doğru yaklaşım olmalıdır.

Demek istediğim, teorik bakış açısıyla, phtml dosyalarına dayanamayan fakat belki de başka bir PHP yapısına dayanan farklı bir PHP tabanlı motor oluşturabiliyorsunuz.

$blockAçıkça bağlam değişkeni olarak geçtiğinden, "phtml" modu için "doğru" yol olarak kabul ediyorum .

$blockve $this->currentBlockteknik açıdan aynıdır, ancak açıkça kullanılırsa $block, onu kod-stil açısından kullanmamız gerektiğini düşünüyorum.


Ancak ikisi de arayüzün $ blok kısmı değildir. Bu uygulamanın bir phtml dosyası içindeyken kullanıldığını varsaymanın güvenli olduğunu söyleyebilirim. Diğer uygulamalar phtml dosyasını kullanmaz.
Fabian Schmengler

Haklısın, ne demek istediğimi açıklamak için cevabımda net değildim. Gönderimi daha fazla ayrıntıyla değiştirdim.
Phoenix128_RiccardoT
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.