第四天:
一、 Magento常用函数记录:
1. Mage::getModel():获得Model对象;
- 在系统配置中寻找节点;
- 在节点中间寻找节点;
- 在节点中寻找节点;
2. Mage::getSingleton():获得单例模式的Model对象;
3. Mage::register()/registry()/unregister():注册全局变量/获取全局变量/注销全局变量;
4. Mage::getBaseUrl():获得当前店铺的路径;
5. Mage::getData():获得对象中的值或某个值;
6. Mage::helper():获得helper对象;
二、创建测试模块
第一步:创建目录结构
app/code/local/YEMA/Test/Block
app/code/local/YEMA/Test/controllers
app/code/local/YEMA/Test/data
app/code/local/YEMA/Test/etc
app/code/local/YEMA/Test/Helper
app/code/local/YEMA/Test/Model
app/code/local/YEMA/Test/sql
第二步:创建config.xml和YEMA_Test.xml文件
app/code/local/YEMA/Test/etc/config.xml
1 <?xml version="1.0"?> 2 <config> 3 <modules> 4 <YEMA_Test> 5 <version>0.0.1</version> 6 </YEMA_Test> 7 </modules> 8 </config> 9 app/etc/modules/YEMA_Test.xml 10 <?xml version="1.0" encoding="UTF-8"?> 11 <config> 12 <modules> 13 <YEMA_Test> 14 <active>true</active> 15 <codePool>local</codePool> 16 </YEMA_Test> 17 </modules> 18 </config>
第三步:清缓存,在System->Configuration->Advanced中确认模块加载;
开始增加逻辑模块:
1. 检查“showConfig”查询字符串是否存在;
2. 如果“showConfig”存在,那么检查“showConfigFormat”查询字符串是否存在;
3. 如果“showConfigFormat”存在,那么输出指定格式的配置信息,否则输出默认格式的配置信息;
4. 终止执行流程;
第四步:编辑config.xml文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <config> 3 <modules> 4 <YEMA_Test> 5 <version>0.0.1</version> 6 </YEMA_Test> 7 </modules> 8 <global> 9 <events> 10 <controller_front_init_routers> 11 <observers> 12 <app_configviewer_model_observer> 13 <type>singleton</type> 14 <class>YEMA_Test_Model_Observer</class> 15 <method>checkForConfigRequest</method> 16 </app_configviewer_model_observer> 17 </observers> 18 </controller_front_init_routers> 19 </event> 20 </global> 21 </config>
第五步:创建YEMA/Test/Model/Observer.php
1 <?php 2 class YEMA_Test_Model_Observer { 3 const FLAG_SHOW_CONFIG = 'showConfig'; 4 const FLAG_SHOW_CONFIG_FORMAT = 'showConfigFormat'; 5 private $request; 6 function checkForConfigRequest($observer) { 7 $this->request = $observer->getEvent ()->getData ( 'front' )->getRequest (); 8 if ($this->request->{self::FLAG_SHOW_CONFIG} === 'true') { 9 $this->setHeader (); 10 $this->outputConfig (); 11 } 12 } 13 private function setHeader() { 14 $format = isset ( $this->request->{self::FLAG_SHOW_CONFIG_FORMAT} ) ? $this->request->{self::FLAG_SHOW_CONFIG_FORMAT} : 'xml'; 15 switch ($format) { 16 case 'text' : 17 header ( "Content-Type:text/plain" ); 18 break; 19 default : 20 header ( 'Content-Type:text/xml' ); 21 } 22 } 23 private function outputConfig() { 24 die ( Mage::App ()->getConfig ()->getNode ()->asXML () ); 25 } 26 }
三、Magento的MVC流程分析及实例测试
Magento的MVC处理流程:
1. URL请求被一个PHP拦截;
2. 这个PHP文件实例化一个Magento对象;
3. Magento对象实例化前端控制器;
4. 前端控制器实例化全局配置中指定的路由对象,可以是多个;
5. 路由对象会逐个与请求URL匹配;
6. 如果发现匹配,那么可以获得一个执行控制器和一个执行方法的名字;
7. 实例化获得的执行控制器,并调用相应的执行方法;
8. 执行方法中处理业务逻辑,模型数据;
9. 控制器实例化布局对象(Layout);
10. 布局对象根据请求的参数,系统配置创建一个块对象(Block)列表,并实例化;
11. 布局对象会调用块对象的output方法生成HTML。这是一个递归的过程,因为块对象可以嵌套块对象;
12. 每一个块对象都和一个模板文件(Template File)对应。块对象包含了显示逻辑,模板文件包含了HTML和PHP输出代码;
13. 块对象直接从模型那里获得数据,换句话说,在Magento的MVC架构中,控制器并不直接把数据传给视图;
下面新建示例来进行实际过程测试及理解:
第一步:创建目录结构
第二步:创建config.xml和YEMA_MVCTest.xml
第三步:清缓存,在System->Configuration->Advanced中确认模块加载;
第四步:配置路由
1 <frontend> 2 <routers> 3 <MVCTest> 4 <use>standard</use> 5 <args> 6 <module>YEMA_MVCTest</module> 7 <frontName>MVCTest</frontName> 8 </args> 9 </MVCTest> 10 </routers> 11 </frontend>
frontend:frontend标签指向一个Magento区(Area),比如“frontend”就是指网站的前台,“admin”是指网站的后台,“install”是指Magento的安装程序。
routers:routers标签有时候包含的是路由对象的定义,有时候包含的是路径的定义。路由对象是进行路由操作的实体,而路径仅仅是路由对象的一个参数。注: 如果仔细看全局配置xml,会发现有两处地方出现routers,一处是“web -> routers”,另外一处是“frontend-> routers”。两处routers包含的内容不一样,第一处包含的是路由对象的定义,第二处包含的是路径的定义。
module:这个标签的内容应该是一个模块的全名,Packagename_Modulename, Magento用这个名字来定位模块文件。
frontName:当一个router解析一个URL的时候,它的路由规则是按照如下规则进行的
http://example.com/frontName/actionControllerName/actionMethod/
第五步:为路由创建执行控制器
创建文件app/code/local/YEMA/MVCTest/controllers/IndexController.php
<?php
class YEMA_MVCTest_IndexController extends Mage_Core_Controller_Front_Action {
function indexAction() {
echo "MVCTest Edit by pisTol at ".date('Y-m-d H:i:s', time());
}
}
第六步:查看路由地址.../MVCTest/(完整地址为/MVCTest/index/index/)