了解Magento块和块类型


105

我只想了解

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

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

请解释

type="A/B"

让我知道A和B的来源吗?

Answers:


126

A是一个模块的别名。在这种情况下,page它的缩写Mage_Page_Blockapp/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。资源模型和助手也会发生同样的事情。如果要拥有模块,模型和帮助器,您自己的模块将需要在配置中定义它们。


@ Clockworkgeek非常感谢。您的回答对我很有帮助。
Anup_Tripathi 2011年

你救了我一吨。谢谢。
Sumit Malik 2013年

很好的解释
Jalpesh Patel'Dec

如果它是重写/覆盖的块,该如何定义和使用块类型呢?
Vicky Dev '02

@VickyDev您不需要做任何其他事情,因为新块将是旧块的后代,因此是兼容的。您可以并且应该假装它根本不存在。
clockworkgeek

158

为了更好地了解magento块类型,以下是一些内置块类型,这些块类型广泛用于布局中。

  1. core/template:此块呈现由其template 属性定义的模板  。布局中定义的大多数块是的类型或子类型  core/template
  2. page/html:这是core/template 根块的子类型,  并定义了根块。所有其他块是该块的子块。
  3. page/html_head:定义页面的HTML标头部分,其中包含JavaScript,CSS等元素。
  4. page/html_header:定义页面的标题部分,其中包含网站徽标,顶部链接等。
  5. page/template_links:此块用于创建链接列表。在页脚和页眉区域中可见的链接使用此块类型。
  6. core/text_list:像某些块  content,  left,  right 等都是类型的  core/text_list。渲染这些块时,将自动渲染其所有子块,而无需调用该getChildHtml() 方法。
  7. page/html_wrapper:此块用于创建包装器块,该包装器将其子块呈现在action设置的HTML标签内  setHtmlTagName。默认标记是  <div> 未设置任何元素。
  8. page/html_breadcrumbs:此块定义页面上的面包屑。
  9. page/html_footer:定义页面的页脚区域,其中包含页脚链接,版权信息等。
  10. core/messages:此块呈现错误/成功/通知消息。
  11. page/switch:此块可用于语言或商店切换器。

这是仅常用块类型的列表。在高级主题实现中还使用了许多其他块类型。


关于什么:{{block type =“ cms / block” block_id =“ terms”}}
daslicht 2015年

5
@daslicht在回答中已经提到:这是仅常用块类型的列表。在高级主题实现中还使用了许多其他块类型。
Kamesh Jungi

谢谢。真的很有帮助。
arqam

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

页面是etc/config.xml文件html中定义的FrontendName,是块类名称

更多细节:

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

首先看一下文件夹结构

app>本地>命名空间>模块名称> etc> config.xml

我们设置 FrontendName = 'mymodule'

app> local>命名空间> modulename> > 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是前端名称

现在进入您模板的

template / example / view.phtml页面

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

喜欢

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

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


您已为块hello.php命名,但块类的名称为'namespace_modulename_Block_Data',名称末尾是否应为Hello?
Rai Ehtisham

5

我不知道“ 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()


3

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

config.xml文件中的示例:

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

nb:我希望我没错。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.