magento2 - 在 magento 2 中,模板中有哪些块方法可用?
问题描述
m2 与 m1 有很大不同。
当我在模板中编写代码(编程公共方法)时,它们似乎不起作用。是否也允许所有方法,例如受保护的和私有的?或吸气剂或只有公共吸气剂?我很困惑。
我相信这只是公共吸气剂,对吗?
任何帮助将不胜感激。
解决方案
块上下文中的所有公共方法都在模板中可用。
块上下文是class
您在布局 XML 中分配给模板的块。相当于type
Magento 1 中的 block。默认是\Magento\Framework\View\Element\Template
,相当于Mage_Core_Block_Template
Magento 1 中的。
$block
此块上下文在渲染期间作为变量分配给模板。这与 Magento 1 不同,后者$this
指的是模板中的块上下文。在 Magento 2 中,$this
指的是负责渲染模板的模板引擎。您可以render
在模板引擎的方法中看到这一切,其中$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;
}
}
您可以通过在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
每个产品页面上的 -container 中。容器会自动渲染它们的子块,所以它们类似于core/text_list
Magento 1 中的块类型。
然后在布局 XML 中配置的模板中app/code/MyNamespace/MyModule/view/frontend/templates/mytemplate.phtml
,您可以使用公共方法和属性,包括isFoo
,但不能使用私有或受保护的方法和属性,如isBar
. 模板文件开头的 Doc-comments 清楚地说明了什么$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>
推荐阅读
- sql - sqlite - 具有唯一约束的 INSERT 最终插入多条记录
- android - Android:圆形图像的框架
- javascript - 在 Firefox 中获取失败/被阻止
- deep-learning - PyTorch:Dropout (?) 导致训练+验证 V. 仅训练的不同模型收敛
- reactjs - React 中有什么方法可以通过扩展属性传递 elementType 吗?
- angular - 如何将 RxJS-Stream 拆分为多个独立的流
- python-3.x - 为什么'打印函数'打印'for循环'迭代的最后一个数字?
- javascript - Javascript 未将表单详细信息发送到 PHP 文件
- android - 如何修复未正确显示 .xml 文件的 Android Studio 错误?
- javascript - Chart.js 3.x 无法在图表上显示数据