Magento2 在magento 2中,模板中有哪些块方法可用?

Magento2 在magento 2中,模板中有哪些块方法可用?,magento2,getter,public-method,Magento2,Getter,Public Method,m2与m1有很大不同 当我在模板中编写代码(编写公共方法)时,它们似乎不起作用。是否所有方法都允许,如受保护和私有?还是只有公众才能获得?我很困惑 我相信这只是公众人物,对吧 非常感谢您的帮助。模板中提供了来自块上下文的所有公共方法 块上下文是在布局XML中指定给模板的块类。它相当于Magento 1中的blocktype。默认情况下,它是\Magento\Framework\View\Element\Template,相当于Magento 1中的Mage\u Core\u Block\u Te

m2与m1有很大不同

当我在模板中编写代码(编写公共方法)时,它们似乎不起作用。是否所有方法都允许,如受保护和私有?还是只有公众才能获得?我很困惑

我相信这只是公众人物,对吧


非常感谢您的帮助。

模板中提供了来自块上下文的所有公共方法

块上下文是在布局XML中指定给模板的块
。它相当于Magento 1中的block
type
。默认情况下,它是
\Magento\Framework\View\Element\Template
,相当于Magento 1中的
Mage\u Core\u Block\u Template

渲染期间,此块上下文作为
$block
变量指定给模板。这与Magento 1不同,Magento 1中的
$This
指的是模板中的块上下文。在Magento 2中,
$this
指的是负责呈现模板的模板引擎。您可以在中看到这一切,其中
$dictionary
参数(包含
$block
等)正好在包含phtml文件之前。这允许在模板中使用所有提取的变量,尤其是
$block

块使用示例 假设您已经在模块中创建了一个自定义块类,名为
app/code/MyNamespace/MyModule/block/MyBlock.php
,如下所示

<?php 

namespace MyNamespace\MyModule\Block;

use Magento\Framework\View\Element\Template;

class MyBlock extends Template
{
    public const FOO = 'foo';
    private const BAR = 'bar';

    public function isFoo(string $str): bool 
    {
        return $str === self::FOO;
    }

    private function isBar(string $str): bool
    {
        return $str === self::BAR;
    }
}
<?xml version="1.0"?>

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="content">
            <block class="MyNamespace\MyModule\Block\MyBlock" name="myblock" template="MyNamespace_MyModule::mytemplate.phtml" />
        </referenceContainer>
    </body>
</page>
这将把
MyBlock
添加到每个产品页面上的
content
-容器中。容器将自动渲染其子块,因此它们类似于Magento 1中的
core/text_list
块类型

然后在布局XML中配置的模板中,
app/code/MyNamespace/MyModule/view/frontend/templates/mytemplate.phtml
,您可以使用公共方法和属性,包括
isFoo
,但不能使用私有或受保护的方法和属性,如
isBar
。模板文件开头的文档注释清楚说明了什么是
$this
$block

<?php
/** @var $this \Magento\Framework\View\TemplateEngine\Php */
/** @var $block \MyNamespace\MyModule\Block\MyBlock */
$thing1 = 'foo';
$thing2 = 'bar';
?>
<div class="my-thing">
    <?php if ($block->isFoo($thing1)): ?>
        <!-- isFoo works since it's a public method -->
    <?php endif; ?>
    <?php if ($block->isBar($thing2)): ?>
        <!-- isBar doesn't work since it's a private method -->
    <?php endif; ?>
    
    <!-- You can access public properties and constants from the $block object, too -->
    <span><?php echo $block::FOO; ?></span>
</div>