【问题标题】:in magento 2 which block methods are available in a template?在 magento 2 中,模板中有哪些块方法可用?
【发布时间】:2018-11-05 19:15:26
【问题描述】:

m2 与 m1 大不相同。

当我在模板中编写代码(编程公共方法)时,它们似乎不起作用。是否也允许所有方法,例如受保护的和私有的?或吸气剂或只有公共吸气剂?我很困惑。

我相信这只是公共吸气剂,对吗?

任何帮助将不胜感激。

【问题讨论】:

    标签: magento2 getter public-method


    【解决方案1】:

    块上下文中的所有公共方法都在模板中可用。

    块上下文是您在布局 XML 中分配给模板的块 class。相当于 Magento 1 中的 type 块。默认为 \Magento\Framework\View\Element\Template,相当于 Magento 1 中的 Mage_Core_Block_Template

    此块上下文在渲染​​期间作为$block 变量分配给模板。这与 Magento 1 不同,其中 $this 指的是模板中的块上下文。在 Magento 2 中,$this 指的是负责渲染模板的模板引擎。您可以在render method of the template engine 中看到这一切,其中$dictionary 参数(包含$block 等)在包含phtml 文件之前是extracted。这允许在模板中使用所有提取的变量,特别是 $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 容器中。容器会自动渲染它们的子块,因此它们类似于 Magento 1 中的 core/text_list 块类型。

    然后在布局 XML 中配置的模板 app/code/MyNamespace/MyModule/view/frontend/templates/mytemplate.phtml 中,您可以使用公共方法和属性,包括 isFoo,但不能使用私有或受保护的方法和属性,如 isBar。模板文件开头的 doc-cmets 明确了 $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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 2014-09-21
      相关资源
      最近更新 更多