在Magento中使用布局
正如我所看到的每个模板文件都存在一个连接特定模块块的布局。 我努力去理解Magento中的每件作品,让我解释我做了什么,
考虑模板appdesignfrontendbasedefaulttemplatecatalogcategoryview.phtml
我们有$_category = $this->getCurrentCategory();
这个功能属于Block appcodecoreMageCatalogBlockCategoryview.php
Magento的模板做的是,它搜索布局而不是块文件,
即内部布局文件, appdesignfrontendbasedefaultlayoutcatalog.xml
我们有<block type="catalog/category_view" name="category.products" template="catalog/category/view.phtml">
在这个布局定义中, type
属性定义了块文件,即通过布局文件模板从Block获取getCurrentCategory()
函数的值。
此外,我们还有<reference name="content">, <reference name="left">
,它决定在哪里追加模板。
我的问题是,
为什么Templates
无法直接从Block
获取值而不参考Layout
?
为什么Magento不允许我们这样做?
在考虑这些3块,布局和模板时,布局有什么用处?
1 - 为什么模板无法直接从块中获取值而不参考布局?
他们能。 使用你的例子:
<block type="catalog/category_view" name="category.products" template="catalog/category/view.phtml">
这可以写成:
<block type="catalog/category_view" name="category.products">
并且在实际的块内( app/code/core/Mage/Catalog/Block/Category/View.php
):
...
public function _construct()
{
parent::_construct();
// set the template here instead
$this->setTemplate('catalog/category/view.phtml');
}
...
2 - 为什么Magento不允许我们这样做?
Magento确实允许你这样做。 Magento的布局系统非常强大,尽管最初很难理解它。
3 - 在考虑这些3块,布局和模板时,布局的用途是什么?
我会用这个问题来澄清你的一些误解。 如前所述,Magento布局非常强大,并且具有很大的灵活性,但乍一看这并不明显。 我会尽力解释我可以。
想象一下,你在Magento中创建了自己的模块,布局不存在 - 一切都在“控制器”内进行控制。 您需要重写/扩展/破解核心Magento代码才能按照您的想法获取内容。 如果您想在类别视图页面上添加一个小部件,您需要重写一个控制器方法,或者添加您自己的控制器。
Magento Layout通过创建一个全局布局文件克服了这个问题,您可以在不影响核心基础架构的情况下进行扩展。
让我们拿你的榜样。
在类别视图页面上,如果我们想要将上面的模板catalog/category/view.phtml
改为别的,请说my/category/view.phtml
,我们可以这样做:
<!-- this is the controller handle -->
<catalog_category_view>
<!--
by referencing, we are actually referring to a
block which has already been instantiated. the
name is the unique name within the layout.
generally all blocks should have a name and it
must be unique. however there can also be
anonymous blocks but thats out of scope of this
answer
-->
<reference name="category.products">
<!--
the layout allows us to fire methods within
the blocks. in this instance we are actually
firing the setTemplate method on the block
and providing a "template" argument.
this is the same as calling:
$this->setTemplate('my/category/view.phtml');
within the block.
-->
<action method="setTemplate">
<template>my/category/view.phtml</template>
</action>
</reference>
</catalog_category_view>
只是重申一下:
此外,我们还有<reference name="content">, <reference name="left">
,它决定在哪里追加模板。
这是不正确的。 “参考”标签允许您引用已经实例化的块。 为了完整起见,下面的例子展示了如何引用另一个块并在其中放置一个块:
<!--
the default layout handle which is call on nearly all
pages within magento
-->
<default>
<!--
we are not referencing the "left" block
we could if we wanted reference "right",
"content" or any other blocks however
these are the most common
-->
<reference name="left">
<!--
add a block
in this example we are going to reference
"core/template" which translates to:
Mage_Core_Block_Template
which exists at:
app/code/core/Mage/Core/Block/Template.php
-->
<block type="core/template" name="my.unique.name.for.this.block" template="this/is/my/view.phtml" />
</reference>
</default>
进一步阅读:介绍Magento布局
要回答你的问题,你需要挖掘Magento的MVC方法,
一个网页在逻辑上被分成几个部分,例如页眉,正文,页脚等,这使得页面布局有条理且易于调整。 Magento通过布局XML文件提供了这种灵活性。 Magento处理这些布局文件并将其渲染到网页中。
布局文件作为应用程序的详细说明,介绍如何构建页面,构建它的内容以及每个构建块的行为。
布局文件按照模块分开,每个模块带有自己的布局文件。系统以这种方式构建,以便无缝地添加和移除模块,而不影响系统中的其他模块。
在Magento中,Model,View,Controller的View组件直接引用系统模型来获取它需要显示的信息。
视图已分为块和模板。 块是PHP对象,模板是包含HTML和PHP混合的“原始”PHP文件。 每个块都绑定到一个单独的模板文件。 在phtml文件中,PHP的$ this关键字将包含对模板的Block对象的引用。
布局文件包含映射到MVC控制器的<handlers>
,所以期待您的处理程序
用于adminhtml/example/index controller
页面的<adminhtml_example_index>
和
<reference name="content">
表示这些块内的块或其他引用将在主题模板上的内容块中可用。
Magento中的每个页面请求都会生成几个独特的句柄。 Magento MVC模式实现的' 视图 '分为两部分: 布局和模板 。 模板代表一个HTML块,而布局则定义了网页上块的位置。
在Magento的MVC方法中,控制器不是为View设置变量(in Magento's case, the view is Layout and Blocks)
。 控制器在模型上设置值,然后从这些模型中读取块。
你的控制器的工作是对模型做某些事情,然后告诉系统它是布局渲染时间。 这是您的布局/块作业根据系统模型的状态以某种方式显示HTML页面。
在Magento中,当一个URL被触发时,
下一篇: Magento extension adding and positioning new blocks in existing/core pages