config文件可以说是Magento的发动机,它从整体上包含了几乎一切模块、模型、类、模板文件等。很多PHP开发者不太适应这种高度的抽象,在开发中也给他们带来了不少的困扰和麻烦,但一旦掌握这种对系统文件的重载机制将带来空前的灵活性。
本节我们将创建一个用于在浏览器中查看系统配置的模块,请尝试跟着我们一起做,这样有助于你更进一步的了解Magento以及主要的名称和用法。
构建模块目录结构
这里我们会创建一个Magento模块,模块由一组php和xml文件组成,用于继承系统类添加新功能或重载系统方法。比如可以是为追踪销售信息添加新的数据模型、修改已有类的方法或添加全新的功能等等。
值得一提的是Magento系统中通常都是基于同一个模块,如果查看app/code/core/Mage的话,会发现里面包含很多的文件夹,这些都是由Magento团队所创建的模块,也正是默认情况下前台所用到的所有模块。
对于自建的模块通常会放在app/code/local/Packagename内,其中Packagename作为唯一标识你所开发代码的命名空间。作为一个不成文的规定,通常建议使用公司的名称,比如app/code/local/Google,在本系列的例子中我们将使用Alanhou,并使用Configviewer作为模块名称,所以首先请创建如下目录结构:
app/code/local/Alanhou/Configviewer/Block
app/code/local/Alanhou/Configviewer/controllers
app/code/local/Alanhou/Configviewer/etc
app/code/local/Alanhou/Configviewer/Helper
app/code/local/Alanhou/Configviewer/Model
app/code/local/Alanhou/Configviewer/sql
我们在本节的模块中不会用到所有这些文件夹,但创建这些文件夹有助于对整个模块结构的了解。下一步我们会创建两个文件
app/code/local/Alanhou/Configviewer/etc/config.xml app/etc/modules/Alanhou_Configviewer.xml
第二个文件按照Packagename_Modulename.xml的规则来进行命名,在config.xml文件中放入如下代码:
<config> <modules> <Alanhou_Configviewer> <version>0.1.0</version> </Alanhou_Configviewer> </modules> </config>
然后在Alanhou_Configviewer.xml中添加如下代码
<config> <modules> <Alanhou_Configviewer> <active>true</active> <codePool>local</codePool> </Alanhou_Configviewer> </modules> </config>
如果你现在对上面的代码还是一头雾水的话,大可不必担心,后面会有详细的介绍。通过上面基本的框架已经搭建好了,执行以下步骤
- 清除缓存
- 在后台中,点击System > Configuration > Advanced > Advanced
- 在Disable modules output面板中查看Alanhou_Configviewer是否出现
如果看到Alanhou_Configviewer,那么恭喜你已经成功创建第一个模块。
创建模块配置文件
你可能已经看到胜利的曙光了,不过截至目前这个模块还没有什么实质意义。这一模块我们计划完成的工作有
- 检查showConfig变量字段是否存在
- 如果showConfig存在,显示Magento的配置并中断其它的执行
- 检测是否存在其它的字符变量,showConfigFormat可以指定以纯文本或xml进行输出
首先我们将在config.xml文件中添加<global>代码块
<config> <modules> <Alanhou_Configviewer> <version>0.1.0</version> </Alanhou_Configviewer> </modules> <global> <events> <controller_front_init_routers> <observers> <Alanhou_configviewer_model_observer> <type>singleton</type> <class>Alanhou_Configviewer_Model_Observer</class> <method>checkForConfigRequest</method> </Alanhou_configviewer_model_observer> </observers> </controller_front_init_routers> </events> </global> </config>
然后创建一个app/code/local/Alanhou/Configviewer/Model/Observer.php文件,加入如下代码:
<?php class Alanhou_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()); } }
然后访问http://localhost/magento/?showConfig=true,就会出现像下面这样的一大串XML代码
代码中主要包含Magento的状态,其中列出了所有的模块、模型、类、事件监听器等内容。
例如在如上的XML输出中搜索Alanhou_Configviewer_Model_Observer就可以找到对应的类。Magento中所有模块的config.xml文件都会被解析并包含到全局设置中。
那这些有什么实际意义呢,你现在看到这些内容可能会被吓到,但配置文件对于理解Magento来说相当之重要。你创建的所有模块都会被加到这个配置文件中,并且你在任何时候调用系统core中的功能时,都会到这个配置文件中去进行查看。
举个例子,熟悉MVC的开发者一定实例化过类似这样的helper类
$helper_sales = new HelperSales();
而Magento对于PHP的类声明进行了抽象化,所以上面的代码在Magento中会像这样
$helper_sales = Mage::helper('sales');
用通俗的话来讲,这个静态helper方法会完成如下动作
- 在Config中查找<helpers />代码段
- 在<helpers />代码段中查找<sales />代码段
- 在<sales />代码段中查找<class />代码段
- 将斜杠后的内容添加到上一步所查找到的内容后(本例采用默认值data)
- 实例化上一步中所查找到的类,即Mage_Sales_Helper_Data
看上去这样有些繁杂,但通过在配置文件中查找类,有助于我们在不修改core代码的情况下重载Magento的系统方法。而且相当的灵活,可以对部分系统方法进行继承修改。