第一章 – Magento强大的配置系统

Magento的配置系统就像是Magento的心脏,支撑着Magento的运行。这套配置系统掌管着几乎所有 “module/model/class/template/etc”。它把整个Magento系统抽象出来,用一个配置文件来描述。这里的“配置文件” 并不是一个物理上存在的文件,而是Magento根据当前的系统状态动态生成的一段XML。大多数的PHP开发者并不习惯于这样抽象层,因为它增加的编程 的复杂性。但是这样的抽象提供了无与伦比的灵活性,允许你覆盖几乎任何系统的默认行为。

首先,让我们写一个简单的插件来看看这个所谓的“配置文件”长什么样。虽然我已经提供的现成的代码 ,但是还是建议你自己建立这个插件,把整个流程走一遍有助于你的理解。

 

设置插件的目录结构

我们将要创建一个Magento的模块【注: Magento的插件不叫plug-in,叫module,翻译成模块】。Magento的模块由php和xml文件组成,目的是扩展或者覆盖系统的行 为,比如为订单增加数据模型,更改一个类的方法,或者增加一个全新的功能。【注:Magento自带的那些功能也都是基于模块的,比如用户注册,商品展 示,结账流程等等。Magento给我的感觉就是一切皆模块,和Eclipse的插件体系结构有点像】

大多数Magento的系统模块的结构和我们将要构建的插件的结构是一样的。Magento的系统模块在以下目录

app/
code/
core/
Mage


每一个子目录都是一个单独的模块。这些模块是由Magento官方开发的。我们安装完Magento以后,所使用的功能就是来自这些模块。我们自己创建的模块应该放在如下目录

app/
code/
local/
Packagename


“Packagename”应该是一个唯一的字符串,用来标识你的代码。通常人们使用公司名字作为Packagename,比如

app/
code/
local/
Microsoft


由于我在做我自己的Magento项目,我将使用我自己的项目名“App”。 然后,我们要创建以下目录结构

app/
code/
local/
App/
Configviewer/
Block
app/ code/ local/ App/ Configviewer/ controllers
app/ code/ local/ App/ Configviewer/ etc
app/ code/ local/ App/ Configviewer/ Helper
app/ code/ local/ App/ Configviewer/ Model
app/ code/ local/ App/ Configviewer/ sql

你的插件并不一定需要包含以上所有的目录,但是为了以后开发方便,我们还是在一开始就把目录创建好。接下来我们要创建两个文件,一个是config.xml,放在etc目录下面

app/
code/
local/
App/
Configviewer/
etc/
config.
xml

文件内容如下

<
config>

< modules>
< App_Configviewer>
< version> 0. 1. 0</ version>
</ App_Configviewer>
</ modules>
</ config>

第二个文件需要在如下位置创建

app/
etc/
modules/
App_Configviewer.
xml

第二个文件应该遵循如下命名规则“Packagename_Modulename.xml”,文件内容如下

<
config>

< modules>
< App_Configviewer>
< active> true</ active>
< codePool> local</ codePool>
</ App_Configviewer>
</ modules>
</ config>

我们先不管这些文件是干什么的,以后会解释。建立好这两个文件以后,你的模块的骨架就已经完成了。Magento已经知道你的模块存在,但是现在你的模块不会做任何事情。我们来确认一下Magento确实装载了你的模块

  1. 清空Magento缓存
  2. 在后台管理界面,进入 System->Configuration->Advanced
  3. 展开“Disable Modules Output”
  4. 确认“App_Configviewer”显示出来了

如果你看到“App_Configviewer”,那么恭喜你,你已经成功创建了你第一个Magento模块!

创建模块逻辑

我们之前创建的模块不会做任何事情,下面我们来为这个模块加入逻辑
1. 检查“showConfig”查询字符串是否存在
2. 如果“showConfig”存在,那么检查“showConfigFormat”查询字符串是否存在
3. 如果“showConfigFormat”存在,那么输出指定格式的配置信息,否则输出默认格式的配置信息
4. 终止执行流程
首先更改我们的config.xml文件

<?xml
 version
="1.0"
 encoding
="UTF-8"
?>


<config>
<modules>
<App_Configviewer>
<version> 0.1.0</version>
</App_Configviewer>
</modules>
<global>
<events>
<controller_front_init_routers>
<observers>
<app_configviewer_model_observer>
<type> singleton</type>
<class> App_Configviewer_Model_Observer</class>
<method> checkForConfigRequest</method>
</app_configviewer_model_observer>
</observers>
</controller_front_init_routers>
</events>
</global>
</config>

然后创建如下文件

App/
Configviewer/
Model/
Observer.
php

输入以下内容

<?php

class App_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

【注: 根据文中的配置,不难看出任何指向Magento的URL加了“?showConfig=true”以后,都会输出同样的内容,正常的执行流程会被终止。】

配置文件分析

打开上述URL,你应该看到一个巨大的XML文件。

这个文件描述了当前Magento系统的状态。它列出了所有的模块,数据模型,类,事件,监听器等等。举个例子,如果你搜索如下字符串

Configviewer_Model_Observer

你会发现刚刚你创建的那个类被列出来了。Magento会解析每个模块的config.xml,并把它们包含在这个全局配置中。

这个配置文件有啥用?

到目前为止,我们所作的事情似乎没什么意义,但是这个配置文件却是理解Magento的关键因素。你创建的每一个模 块都会被加到这个配置文件中,任 何时候,你需要调用一个系统功能的时候,Magento都会通过这个配置文件来查询相应的模块和功能。举个简单的例子,如果你懂MVC的话,你应该和 “helper class”之类概念的打过交道

$helper_salesrule
 =
 new
 Mage_SalesRule_Helper(
)
;

Magento抽象了PHP的类声明方式。在Magento系统中,上面的代码等同于

$helper_salesrule
 =
 Mage::
helper
(
'salesrule'
)
;

Magento将通过以下逻辑来处理这行代码

  1. 在配置文件中查找标签
  2. 在里面查找 标签
  3. 在里面查找 标签
  4. 实例化从#3找到的类(Mage_SalesRule_Helper)

Magento总是通过配置文件来获得类名,这个逻辑看起来有些复杂,但这样做的优点也很明显,我们可以不需要更改 Magento的代码就能更改 Magento的核心功能。【注: 在这个例子中,我们可以通过修改配置文件用我们自己的SalesRule_Helper类来替换原来那个】这种高度抽象的编程方式在php中并不常见,但 是它可以让你清晰的扩展或者替换系统的某一部分。

来自: http://hi.baidu.com/190420456/blog/item/478d0ba65d96169ad043583b.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值