在 magento 2 中,哪些块方法在模板中可用?
in magento 2 which block methods are available in a template?
m2 与 m1 有很大不同。
当我在模板中编写代码(编写 public 方法)时,它们似乎无法正常工作。是否也允许所有方法,例如受保护的和私有的?或吸气剂或仅 public 吸气剂?我很困惑。
我相信这只是 public getter 对吗?
如有任何帮助,我们将不胜感激。
所有 public 来自块上下文的方法在模板中可用。
块上下文是您在布局 XML 中分配给模板的块 class
。它相当于Magento 1中的块type
。默认情况下它是\Magento\Framework\View\Element\Template
,相当于Magento 1中的Mage_Core_Block_Template
。
此块上下文在渲染期间作为 $block
变量分配给模板。这与 Magento 1 不同,其中 $this
指的是模板中的块上下文。在 Magento 2 中,$this
指的是负责渲染模板的模板引擎。在包含 phtml 文件之前,您可以在 render
method of the template engine, where the $dictionary
parameter (containing $block
among others) is extracted 中看到这一切。这允许在模板中使用所有提取的变量,特别是 $block
。
块用法示例
假设您在模块中创建了一个自定义块 class,就像这样 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;
}
}
您可以通过在 app/code/MyNamespace/MyModule/view/frontend/layout/catalog_product_view.xml
中像这样创建一个文件来将此块包括到每个产品页面。
<?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
中配置的模板中,可以使用public方法和属性,包括isFoo
,但不能使用private或protected喜欢 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>
m2 与 m1 有很大不同。
当我在模板中编写代码(编写 public 方法)时,它们似乎无法正常工作。是否也允许所有方法,例如受保护的和私有的?或吸气剂或仅 public 吸气剂?我很困惑。
我相信这只是 public getter 对吗?
如有任何帮助,我们将不胜感激。
所有 public 来自块上下文的方法在模板中可用。
块上下文是您在布局 XML 中分配给模板的块 class
。它相当于Magento 1中的块type
。默认情况下它是\Magento\Framework\View\Element\Template
,相当于Magento 1中的Mage_Core_Block_Template
。
此块上下文在渲染期间作为 $block
变量分配给模板。这与 Magento 1 不同,其中 $this
指的是模板中的块上下文。在 Magento 2 中,$this
指的是负责渲染模板的模板引擎。在包含 phtml 文件之前,您可以在 render
method of the template engine, where the $dictionary
parameter (containing $block
among others) is extracted 中看到这一切。这允许在模板中使用所有提取的变量,特别是 $block
。
块用法示例
假设您在模块中创建了一个自定义块 class,就像这样 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;
}
}
您可以通过在 app/code/MyNamespace/MyModule/view/frontend/layout/catalog_product_view.xml
中像这样创建一个文件来将此块包括到每个产品页面。
<?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
中配置的模板中,可以使用public方法和属性,包括isFoo
,但不能使用private或protected喜欢 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>