有些人容易把frontname和前端控制器(Front Controller)混淆起来。它们是两个不同的概念,frontname只跟路由相关,学过Zf的人都知道,其实就是个模块名。【注: 根据我们前面讲过的Magento的MVC流程,前端控制器是用来实例化所有路由的,而这里的“frontName”只是路由过程中的一个参数】
什么是 helloworld?
这个标签的名字应该是模块名字的小写版本。我们的模块名字是“Helloworld”,所以这里我们用“helloworld”。你应该也已经注意到我们定义的“frontName”也是和我们的模块相匹配的。这是一个不成文的规定,但不是强制要求。事实上,一个模块可以定义多个,也就是可以有多个 “frontName”。
为路由创建执行控制器
还记得Magento的MVC流程吗?路由会把控制权交给执行控制器。上面我们定义了路由,现在我们来定义我们的执行控制器。首先创建文件
app/code/local/App/Helloworld/controllers/IndexController.php
模块的控制器应该放在模块的子目录“controllers”(小写c)里面。这是规定,Magento会在这个目录寻找模块的控制器文件。我们的第一个控制器包含以下内容
class App_Helloworld_IndexController extends Mage_Core_Controller_Front_Action { public function indexAction() { echo 'Hello World!'; } }
清空Magento缓存,请求如下URL
http://exmaple.com/helloworld/index/index
如果你看到一个空白页面上面写着“Hello World”,那么恭喜你,你已经成功创建了你的第一个Magento控制器!
如何命名执行控制器?
还记得config.xml的标签吗?
以标签的内容开始 (App_Helloworld) 紧接一个下划线 (App_Helloworld_)
加上我们给控制器取的名字“Index”(App_Helloworld_Index)
最后加上关键词“Controller” (App_Helloworld_IndexController)
我们自己定义的属于frontend区的执行控制器都应该继承Mage_Core_Controller_Front_Action。
URL里面的index/index是什么意思?
正如前文所述,Magento默认的路由的规则如下
http://example.com/frontName/actionControllerName/actionMethod/ 所以在我们请求的URL
http://exmaple.com/helloworld/index/index 其中“helloworld”是“frontName”,第一个“index”是执行控制器(Action Controller)的名字,第二个“index”是执行方法的名字。对比我们写的执行控制器代码,我们不难发现执行方法的定义是执行方法名字加上 “Action”关键字
public function indexAction(){...}
Magento根据命名规则找到执行控制器文件并实例化,然后再根据命名规则调用指定的执行方法。如果URL没有给出执行控制器名字或者执行方法,Magento会用默认的“index”来替代,所以下面三个URL是等价的
http://exmaple.com/helloworld/index/index http://exmaple.com/helloworld/index/ http://exmaple.com/helloworld/
我们再来看一个例子。如果URL如下
http://exmaple.com/checkout/cart/add Magento的执行步骤如下
查询全局配置,找到frontName “checkout”对应的模块,Mage_Checkout 找到执行控制器 “Mage_Checkout_CartController” 调用执行控制器的“addAction”方法 进一步理解执行控制器
下面我们来为我们的执行控制器添加一个执行方法。添加如下代码到IndexController.php
public function goodbyeAction() { echo 'Goodbye World!'; }
请求URL
http://example.com/helloworld/index/goodbye
这次你应该看到“Goodbye World!”。因为我们继承了“Mage_Core_Controller_Front_Action”,我们可以使用一些父类已经定义好的方法和变量。比如父类会把URL后面跟的参数转换成key/value的数组。添加如下代码到我们的执行控制器
public function paramsAction() { echo '
foreach($this->getRequest()->getParams() as $key=>$value) { echo '
echo '
}
echo ''; }
请求如下URL
http://example.com/helloworld/index/params?foo=bar&baz=eof 你应该看到如下输出 Param: foo Value: bar Param: baz Value: eof
最后,让我们再写一个执行控制器,用来处理以下URL
http://example.com/helloworld/messages/goodbye
这里的执行控制器名字是“messages”,所以我们要创建如下文件
app/code/local/App/Helloworld/controllers/MessagesController.php 执行控制器的类名应该是
App_Helloworld_MessagesController 添加执行方法
public function goodbyeAction() {
echo 'Another Goodbye'; }
好了,Magento的MVC架构大概就是这样了。它比传统的PHP MVC要复杂一点,但是Magento的这个高度灵活的MVC架构能让你创造出几乎所有你能想到的URL结构。
深入理解Magento – 第三章 – Magento的布局(Layout),块(Block)和模板(Template)
Jun 05,2011 | 10:37 am | in 转载社区——magento开发教程 | click (278) 我们接着研究Magento。根据我们第 二章讲的Magento MVC的架构,我们接下来应该讲模型(Model),但是我们跳过模型先来看布局和块。和一些流行的PHP MVC架构不同的是,Magento的执行控制器不直接将数据传给试图,相反的视图将直接引用模型,从模型取数据。这样的设计就导致了视图被拆分成两部 分,块(Block)和模板(Template)。块是PHP对象,而模板是原始PHP文件,混合了XHTML和PHP代码(也就是把PHP作为模板语言 来使用了)。每一个块都
和一个唯一的模板文件绑定。在模板文件phtml中,“$this”就是指该模板文件对应的快对象。
让我们来看一个例子
File:
app/design/frontend/base/default/template/catalog/product/list.phtml 你将看到如下代码
getLoadedProductCollection() ?> count()): ?>
__('There are no products matching the selection.') ?>
这里“getLoadedProductCollection”方法可以在这个模板的块对象“Mage_Catalog_Block_Product_List”中找到
File: app/code/core/Mage/Catalog/Block/Product/List.php ...
public function getLoadedProductCollection() {
return $this->_getProductCollection(); } ...
块的“_getProductCollection”方法会实例化模型,并读取数据然后返回给模板。
嵌套块
Magento把视图分离成块和模板的真正强大之处在于“getChildHtml”方法。这个方法可以让你实现在块中嵌套块的功能。顶层的块调用第二层的块,然后是第三层??这就是Magento如何输出HTML的。让我们来看一下单列的顶层模板
File: app/design/frontend/base/default/template/page/1column.phtm
* Template for Mage_Page_Block_Html */ ?>
相关推荐: