Magento开发文档(四)Magento 布局、块 、模板
刚入门magento的开发者容易吧布局和视图给混淆. 本文将看看Magento的Layout/Block的做法,并告诉您如何将其融入Magento的MVC的世界观。 与许多流行的MVC系统相比,Magento的执行控制器不通过数据对象到视图或在视图对象中设置属性(只有少数例外)。相反,视图组件直接引用系统模型来获得它需要显示的信息。 这样的设计决策的后果之一是,视图分成块和模板。块是PHP对象,模板是包含HTML和PHP(在这里PHP作为模板语言)“原始”的PHP文件(带.phtml扩展名)的组合。每一个块都和一个唯一的模板文件绑定。在模板文件 phtml中,“$this”就是指该模板文件对应的块对象。
一个简单的例子看一个默认的产品模板的文件
你会看到下面的PHP模板代码。
getLoadedProductCollection method方法可以在改模板的Block的class中找到。Mage_Catalog_Block_Product_List找到如图所示
1
|
File
:
code
core
Mage
Catalog
Block
Product
List
php
|
1
2
3
4
5
6
|
.
public
function
)
{
return
$
this
_getProductCollection
;
}
块的_getProductCollection方法实例化模型,并读取它们的数据,其结果返回给模板。
嵌套块Magento 把视图分离成块和模板的真正强大之处在于“getChildHtml”方法。这个方法可以让你实现在块中嵌套块的功能。顶层的块调用第二层的块,然后是第三层……这就是 Magento如何输出 HTML的。 块调用块调用块是如何为您的网页的整个HTML布局中创建的。看看一列布局模板。
1
|
page
one
-
column
模板本身只有11行代码。然而,每次调用$此> getChildHtml(…)将包含和引入另一个块。使用getChildHtml将依次引入另外一个块的HTML 内容,直到最底层的块。 Magento布局文件到这里,块和模板你大概已经熟悉了,但你可能有以下疑问
Magento 引入了布局对象(Layout Object)来解决上面的那些问题。布局对象(或者说布局文件)就是一个 XML文件,定义了一个页面包含了哪些块,并且定义了哪个块是顶层块。 上次我们是直接从我们的操作方法中输出内容。这一次,让我们为我们的Hello World模块,一个简单的HTML模板。 首先,创建一个文件:
1
|
layout
local
xml
|
包含以下内容
1
2
3
4
5
|
layout
version
"0.1.0"
>
<
default
>
block
type
"page/html"
name
"root"
output
"toHtml"
template
"magentotutorial/helloworld/simple_page.phtml"
/
>
/
>
layout
创建模板文件
1
|
magentotutorial
helloworld
simple_page
加入以下内容
找到
这里我们拿到了一个基本类名“Mage_Page_Block”,然后添加“html”到基本类名后面,我们就得到最终的块对象的类名 如果我们创建一个已经存在的且具有相同名称的块的块,新的块实例将取代原来的实例。这时我们的引用(reference)文件从local.xom中。
>
>
>
>
在这里,块“root”被我们用<reference />替换了,指向了一个不同的模板文件。
references的使用 <refernce name=”” />将挂钩于一个指定name的xml块中<refernce name=”” />。<block />节点将作为子块来被父块引用。
同时将产生一个手柄名为helloworld_index_index
包布局 包布局和我们以前讲过的全局配置有些相似。它是一个巨大的XML 文档包含了Magento 所有的布局配置。我们可以通过以Layout View模块来查看包布局,请求一下 URL
1
|
//example.com/helloworld/index/index?showLayout=package
|