Magento 2 Templates:使用`$ 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模板调用受保护的方法。

但是除此之外,每个(我认为吗?)模板都有一个名为$blockpopulated 的变量,该变量引用父块对象。您可以在Magento的列表模板中看到此用法

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

使用$block变量但从未明确定义的位置。

除了上述差异之外,使用一种技术与另一种技术之间是否有区别?即两者都做$block,并$this->currentBlock指向同一个对象吗?

Answers:


32

在一个模板文件,$block并且$this->_currentBlock是同一个东西。

看一下模板引擎中的render方法Php.php
在包含模板文件之前,会发生这种情况:$this->_currentBlock = $block;然后使用simple来包含模板文件include $fileName;
这意味着在模板内部您仍然在Php模板引擎内部。这就是为什么$this起作用,这就是为什么$block要定义。

[编辑]
我刚刚发现不建议使用$this内部模板。
使用$this内部模板时,具有EcgM2标准的php嗅探器显示警告。
替换$this$block可使警告消失。


因此,这是.phtml文件$ block或$ this中的默认对象。
Manish Goswami

您默认是什么意思?
马里斯

模板中用于访问模板的呈现类的默认变量是什么?这两个访问功能之间有什么区别吗?
Manish Goswami

它说在纽约市的答案。两者均可,但建议使用$block
Marius

5

据我所知,它们在PHP TemplateEngineInterface中几乎相同,但请记住,在Magento2中,您可以创建自定义模板引擎。与其中只有phtml文件的Magento1不同。

如果看到,TemplateEngineInterface则看不到任何调用的方法的引用currentBlock,因此我认为该$this->currentBlock方法是特定于PHP模板的。

但是为了独立于模板引擎,$block应该是正确的方法。

我的意思是,从理论上讲,您可以创建一个不同的基于PHP的引擎,该引擎不依赖于phtml文件,但可能依赖于其他一些PHP结构。

我假定$block它是“ phtml”模式的“正确”方式,因为它作为上下文变量显式传递。

$block并且$this->currentBlock是从技术上看是相同的,但如果他们明确地使用$block我认为,我们应该使用它,从一个代码样式点。


但是$ block都不是接口的一部分。我可以肯定地说,当您位于phtml文件中时,可以使用此实现。其他实现将不使用phtml文件。
Fabian Schmengler '16

您说得对,我的回答还不清楚,无法解释我的意思。我修改了更多详细信息。
Phoenix128_RiccardoT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.