了解 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>
:content
、left
、right
等某些块属于core/text_list
类型。渲染这些块时,它们的所有子块都会自动渲染,无需调用getChildHtml()
方法。
<strong>page/html_wrapper</strong>
:此块用于创建一个包装块,该块将其子块呈现在由操作setHtmlTagName
设置的 HTML 标记内。如果未设置任何元素,则默认标记为 <div>
。
<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
是模块的别名。在这种情况下,page
是 Mage_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">)
相关的块类名称,并且每个块的名称都是唯一的。
先看文件夹结构
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 页面:
<block type="mymodule/data" name="xyz" template="example/view.phtml">
这里 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>
不,你没有错。但是"<!-- script -->"
可能会令人困惑。让我们澄清一下:正如上面的答案所述,这是一个别名,由两部分组成,第一部分(“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 文件?
php Laravel Valet Magento 2驱动程序,帮助我每天使用Nginx和Mysql安装本地Magento 2开发位置。欲了解更多信息