标签:
Magento是一个php电子商务系统.
内部模块化.
Magento系统模块
app/code/core/Mage
其中每一个子目录都是一个单独的模块
自己创建的模块放在下面路径
app/code/local/Packagename
自创的新模块应该包含以下目录结构
app/code/local/Packagename/Configviewer/Block
app/code/local/Packagename/Configviewer/cotrollers
app/code/local/Packagename/Configviewer/etc
app/code/local/Packagename/Configviewer/Helper
app/code/local/Packagename/Configviewer/Model
app/code/local/Packagename/Configviewer/sql
接下来还需要创建两个文件
一个是config.xml
app/code/local/Packagename/Configviewer/etc/config.xml
文件内容如下
<config> <modules> <Packagename_Configviewer> <version>0.1.0</version> </Packagename_Configviewer> </modules> </config>
第二个文件创建在
app/etc/modules/Packagename_Configviewer.xml
此文件命名规则"包名_模块名.xml" 即"Packagename_Modulename.xml"
文件内容如下
<config> <modules> <Packagename_Configviewer> <active>true</active> <codePool>local</codePool> </Packagename_Configviewer> </modules> </config>
先看看创建的模块有没有被加载出来:
1. 清空magento 缓存
2. 在后台管理界面, 进入System->Configuration->Advanced
3. 展开 "Disable Modules Output"
4. 确认 "Package_Configviewer" 显示出来了
如果看到 Package_configviewer 那么这个新模块创建成功.
之前只是创建了模块的骨架, 现在为这个模块输入逻辑:
1. 检查 "showConfig" 查询字符串是否存在
2. 检查 "showConfig" 存在, 那么检查 "showConfigFormat" 查询字符串是否存在
3. 如果 "showConfigFormat" 存在, 那么输出指定格式的配置信息 否则输出默认格式的配置信息
4. 终止执行流程
首先config.xml文件需要修改
<config> <modules>...</modules> <global> <events> <controller_front_init_routers> <observers> <alanstormdotcom_configviewer_model_observer> <type>singleton</type> <class>Alanstormdotcom_Configviewer_Model_Observer</class> <method>checkForConfigRequest</method> </alanstormdotcom_configviewer_model_observer> </observers> </controller_front_init_routers> </events> </global> </config>
然后创建如下文件
Packagename/Configviewer/Model/Observer.php
输入以下内容
<?php class Alanstormdotcom_Configviewer_Model_Observer { const FLAG_SHOW_CONFIG = ‘showConfig‘; const FLAG_SHOW_CONFIG_FORMAT = ‘showConfigFormat‘; private $request; public function checkForConfigRequest($observer) { $this->request = $observer->getEvent()->getData(‘front‘)->getRequest(); if($this->request->{self::FLAG_SHOW_CONFIG} === ‘true‘) { $this->setHeader(); $this->outputConfig(); } } private function setHeader() { $format = isset($this->request->{self::FLAG_SHOW_CONFIG_FORMAT}) ? $this->request->{self::FLAG_SHOW_CONFIG_FORMAT} :‘xml‘; switch($format) { case ‘text‘: header("Content-Type: text/plain"); break; default: header("Content-Type: text/xml"); } } private function outputConfig() { die(Mage::app()->getConfig()->getNode()->asXML()); } }
然后清空Magento缓存, 输入URL: http://magento.example.com/?showConfig=true
显示出来的页面是巨大的XML文件, 描述了系统状态, 列出所有的模块, 数据类型, 类, 事件, 监听器, Magento会解析每个模块的config.xml, 并把他包含在这个全局配置中.
一般PHP实例化一个类是这样的:
$helper_salesrule = new Mage_Salesrule_Helper();
Magento抽象了PHP的实例化模式, 在Magento中, 上面的代码等同于
$helper_salesrule = Mage::helper(‘salesrule‘);
Magento按照以下逻辑处理:
1. 在配置文件中查找<helpers />标签
2. 在<helpers />中查找 <salesrule />标签
3. 在<salesrule /> 中查找class
4. 实例化从#3中找到的类(Mage_Salesrule_Helper)
这样看起来有些麻烦, 但好处是我们不需要更改Magento的代码就可以更改Magento的核心功能.
MVC流程:
1. URL请求被一个PHP文件拦截, 通常称为前端控制器(Front Controller)
2. 这个PHP文件分析URL, 获得一个执行控制器的名字(Action Controller)和一个执行方法(Action Method)的名字, 这个过程通常称为路由(Routing)
3. 实例化#2获得的执行控制器
4. 调用执行控制器的执行方法
5. 执行方法中处理业务逻辑, 比如获取数据
6. 执行控制器负责把数据传给显示逻辑
7. 显示逻辑生成HTML
Magento的MVC流程和这个不同:
1. URL请求被一个PHP文件拦截
2. 这个PHP文件实例化一个Magento对象
3. Magento对象实例化前端控制器
4. 前端控制器实例化全局配置中指定的路由对象, 可以是多个
5. 路由对象会逐个与请求URL匹配
6. 如果发现匹配, 那么可以获得一个执行控制器和执行方法的名字
7. 实例化#6获得的执行控制器并调用相应的执行方法
8. 执行方法中 处理业务逻辑, 数据模型
9. 控制器实例化布局对象(Layout)
10. 布局对象根据请求的参数, 系统配置创建一个块对象(Block)列表, 并实例化
11. 布局对象会调用块对象的output方法生成HTML. 这是一个递归的过程, 因为块对象可以嵌套块对象
12. 每一个块对象和一个模板文件(Template File)对应, 块对象包含了显示逻辑, 模版文件包含了HTML和PHP代码输出
13. 块对象直接从模型那里获取数据, 也就是说 Magento 的MVC 架构中, 控制器不直接把数据传给视图
标签:
原文地址:http://www.cnblogs.com/derrck/p/4650728.html