了解 Magento 块和块类型

Posted

技术标签:

【中文标题】了解 Magento 块和块类型【英文标题】:Understanding Magento Block and Block Type 【发布时间】:2011-10-01 18:37:54 【问题描述】:

我只是想明白它的意思

 <block type="page/html" name="root" output="toHtml" template="example/view.phtml">

我从 Google 获得了很多参考资料并了解了很多关于它的内容,但我仍然无法理解 type="page/html" 的形成如何为我的自定义模块形成类型。

请解释

type="A/B"

让我知道这个 A 和 B 来自哪里?

【问题讨论】:

【参考方案1】:

为了进一步了解 magento 块类型,以下是一些在布局中广泛使用的内置块类型。

    <strong>core/template</strong>:此块呈现由其template 属性定义的模板。布局中定义的大部分块的类型或子类型为core/template<strong>page/html</strong>:这是core/template 的子类型,定义了根块。所有其他块都是该块的子块。 <strong>page/html_head</strong>:定义页面的 HTML 头部部分,其中包含 javascript、CSS 等元素。 <strong>page/html_header</strong>:定义页面的标题部分,其中包含站点徽标、顶部链接等。 <strong>page/template_links</strong>:此块用于创建链接列表。页脚和页眉区域中可见的链接使用此块类型。 <strong>core/text_list</strong>contentleftright 等某些块属于core/text_list 类型。渲染这些块时,它们的所有子块都会自动渲染,无需调用getChildHtml() 方法。 <strong>page/html_wrapper</strong>:此块用于创建一个包装块,该块将其子块呈现在由操作setHtmlTagName 设置的 HTML 标记内。如果未设置任何元素,则默认标记为 &lt;div&gt;<strong>page/html_breadcrumbs</strong>:此块定义页面上的面包屑。 <strong>page/html_footer</strong>:定义页面的页脚区域,包含页脚链接、版权信息等。 <strong>core/messages</strong>:此块呈现错误/成功/通知消息。 <strong>page/switch</strong>:此块可用于语言或商店切换器。

这是一个仅列出常用块类型的列表。还有许多其他块类型用于高级主题实现。

【讨论】:

怎么样: block type="cms/block" block_id="terms" @daslicht 在回答中已经提到:这是仅常用块类型的列表。还有许多其他块类型用于高级主题实现。 谢谢。真的很有帮助。【参考方案2】:

A 是模块的别名。在这种情况下,pageMage_Page_Block 的缩写(如果你想看,它在 app/code/core/Mage/Page/etc/config.xml 中定义)。

B 是相对于别名的类名,每个单词的首字母大写。在这种情况下,html 变为 Html 并附加到解析的别名,因此它是 Mage_Page_Block_Html。这可能在文件app/code/core/Mage/Page/Block/Html.php 中找到,因为类名直接转换为 Magento 中的位置。

如果您使用模型别名而不是块别名,那么 page 将改为 Mage_Page_Model。资源模型和助手也会发生同样的事情。如果要拥有块、模型和助手,您自己的模块将需要在 config 中定义这些。

【讨论】:

@clockworkgeek 非常感谢。你的回答对我很有帮助。 你为我节省了很多。谢谢。 很好的解释 如果它是一个重写/覆盖的块,我该如何定义和使用块类型呢? @VickyDev 你不需要做任何不同的事情,因为新块将是旧块的后代,因此是兼容的。你可以而且应该假装它甚至不存在。【参考方案3】:
<block type="page/html" name="root" output="toHtml" template="example/view.phtml">

page 是在etc/config.xml 文件中定义的 FrontendName html 是块类名

更多细节:

在这一行type(type="page/html") 中定义与您的template(template="example/view.phtml"&gt;) 相关的块类名称,并且每个块的名称都是唯一的。

先看文件夹结构

app>local>namespace>modulename>etc>config.xml

我们设置FrontendName = 'mymodule'

app>local>namespace>modulename>Block>hello.php

在 hello.php 你创建了一个函数

   class namespace_modulename_Block_Data extends Mage_Core_Block_Template
   
    public function mydata()
        
            $data = "Block is called";
            return $data;
              
   

现在来到你的布局 xml 页面:

&lt;block type="mymodule/data" name="xyz" template="example/view.phtml"&gt; 这里 mydata 是前端名称

现在来到你的模板的

模板/示例/view.phtml 页面

这里可以直接调用mydata()函数

喜欢

<div>
<?php echo $this->mydata(); ?>
</div>

现在您可以在浏览器中获取输出 “块被调用”

【讨论】:

你把block命名为hello.php,但是block类的名字是'namespace_modulename_Block_Data',不应该是名字后面的Hello吗?【参考方案4】:

我不知道“B”类型,但“A”指的是 config.xml 中的模块名称标签 config.xml 中的示例:

<A><!-- script --></A>

不,你没有错。但是"&lt;!-- script --&gt;" 可能会令人困惑。让我们澄清一下:正如上面的答案所述,这是一个别名,由两部分组成,第一部分(“A”)本身是您在模块config.xml 中为模块类定义的别名,第二部分是路径相对于节点的值。这些一起(“A”+大写的“B”)将被翻译成一个类名,使用第一部分(“A”节点的值)完全按照你的定义(如果你不想要小时,请注意大写/小写痛苦),第二部分在每个下划线后大写。因此,从带有块和此配置的 A/B 示例开始:

<config>
  ...
  <global>
    <blocks>
      <A>Vendor_Module_Block</A>
    </blocks>
  </global>
  ...
</config>

在运行时 A/B 将由 Magento 配置解析为 Vendor_Module_Block_B,然后自动加载将包含在以下路径中:public/app/local/Vendor/Module/Block/B.php。为了更好地理解我建议你看看Mage_Core_Model_Config::getGroupedClassName()Mage_Core_Model_Config::getModelInstance()Varien_Autoload::autoload()

【讨论】:

【参考方案5】:

我不知道“B”类型,但“A”指的是你在 config.xml 中的模块名称标签

config.xml 文件中的示例:

<A><!-- script --></A>

nb:我希望我没有错..

【讨论】:

以上是关于了解 Magento 块和块类型的主要内容,如果未能解决你的问题,请参考以下文章

Magento 2 - 如何在另一个 phtml 文件、xml 布局、静态块和 cms 页面中调用自定义 phtml 文件?

扩展 Magento 购物车

如何在 Magento 2.3 中加入两个自定义表

php Laravel Valet Magento 2驱动程序,帮助我每天使用Nginx和Mysql安装本地Magento 2开发位置。欲了解更多信息

Magento学习手记(第一天)

magento 非法块类型