Magento 的配置文件如同该系统的心脏一般。它负责从总体上配置所有被请求的模块,模型,类,模板文件等。它是绝大部分PHP程序员不会接触到的一块抽象层,虽然它增加了开发时间,混乱和挠头的形式,但是,所有这些都是值得的,因为Magento的配置文件允许你对系统的默认功能进行你无法想象的高度扩展。
为了学习Magento配置文件,我们将会在本章创建一个Magento模块,使其能够在浏览器中访问并显示Magento系统的配置文件。同时通过复制和粘贴下面的代码,它的价值在你自己的经历,以此来开始越来越舒服的事情,你在跟Magento打交道的同时,也学习了关键术语。
本篇文章中包括
- 设置一个Magento模块的目录结构
- 创建模块的配置文件
- 我能在配置文件中找到什么有用信息?
- 为什么配置文件对我如此重要?
设置magento模块结构
我们将要创建一个Magento的模块。模块是一组为了扩展系统的新功能,或覆盖核心系统行为的PHP与XML文件。这可能意味着增加额外的数据模型来跟踪销售信息,改变已存在的类的行为,或添加全新的功能。
值得一提的是,最基础的Magento系统的使用,你将使用相同的模块系统建成。如果你看一下
每个文件夹是通过Magento的团队建立了一个独立的模块。总之,这些模块形成你使用的社区购物车系统。你的模块应该放在以下文件夹中
|
app
/
code
/
local
/
Packagename
|
“Packagename”应该是在你的code里面唯一的命名空间/包的字符串,这应该是你公司名称的非官方公约。我们可以随意命名并且这个名字不侵犯他人公司的名字
|
app
/
code
/
local
/
Microsoft
|
我们将用”Magentotutorial”作为我们的Packagename
现在,添加一个模块到你的magento系统,创建以下目录结构
|
app
/
code
/
local
/
Magentotutorial
/
Configviewer
/
Block
app
/
code
/
local
/
Magentotutorial
/
Configviewer
/
controllers
app
/
code
/
local
/
Magentotutorial
/
Configviewer
/
etc
app
/
code
/
local
/
Magentotutorial
/
Configviewer
/
Helper
app
/
code
/
local
/
Magentotutorial
/
Configviewer
/
Model
app
/
code
/
local
/
Magentotutorial
/
Configviewer
/
sql
|
你没有必要将所有这些文件夹都加到每一个模块,但现在设置他们全部是一个聪明的想法。
接下来,还有你需要创建两个文件。第一,config.xml文件,进去刚创建的文件夹etc。
|
app
/
code
/
local
/
Magentotutorial
/
Configviewer
/
etc
/
config
.
xml
|
第二个文件应在以下位置创建
|
app
/
etc
/
modules
/
Magentotutorial_Configviewer
.
xml
|
本文件的命名约定是Packagename_Modulename.xml。
config.xml文件应包含以下内容的XML。不要太担心这些看不懂,我们将在下面会讲到
|
<
config
>
<
modules
>
<
Magentotutorial_Configviewer
>
<
version
>
0.1.0
<
/
version
>
<
/
Magentotutorial_Configviewer
>
<
/
modules
>
<
/
config
>
|
最后,Magentotutorial_Configviewer.xml应包含以下XML。
|
<
config
>
<
modules
>
<
Magentotutorial_Configviewer
>
<
active
>
true
<
/
active
>
<
codePool
>
local
<
/
codePool
>
<
/
Magentotutorial_Configviewer
>
<
/
modules
>
<
/
config
>
|
就是这样。您现在有一个光秃秃的骨头模块不会做任何事情,但Magento的都知道的。为了确保你所做的一切权利,请执行以下操作:
1. 清空Magento缓存
2. 在Magento管理,进入System->Configuration->Advanced
3. 在“Disable modules output”面板里验证,Magentotutorial_Configviewer将显示出来
恭喜你,你已经建立了你的第一个Magento的模块!
创建一个模块配置
当然,这个模块没有做任何事情。当我们完成后,我们的模块将
1. 检查是否有“showConfig”查询字符串变量的存在
2. 如果showConfig存在,显示我们的Magento的配置和停止正常执行
3. 检查是否有额外的查询字符串变量,showConfigFormat,这将让我们指定的文本或XML输出的存在。
首先,我们将在下面的<global>部分加入到我们的config.xml文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<
config
>
<
modules
>
.
.
.
<
/
modules
>
<
global
>
<
events
>
<
controller_front_init_routers
>
<
observers
>
<
Magentotutorial_configviewer_model_observer
>
<
type
>
singleton
<
/
type
>
<
class
>
Magentotutorial_Configviewer_Model_Observer
<
/
class
>
<
method
>
checkForConfigRequest
<
/
method
>
<
/
Magentotutorial_configviewer_model_observer
>
<
/
observers
>
<
/
controller_front_init_routers
>
<
/
events
>
<
/
global
>
<
/
config
>
|
然后,创建一个文件
|
Magentotutorial
/
Configviewer
/
Model
/
Observer
.
php
|
并添加一下代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<
?
php
class
Magentotutorial_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缓存,然后加载任意Magento的URL并加上showConfig=true的查询字串
|
http
:
//magento.example.com/?showConfig=true
|
你看到了什么?
你会看到一个巨大的XML文件。它描述了当前运行的Magento系统的整个状态。列出了所有模块,型号,类别,事件侦听器或几乎任何你能想到的。
例如,假设您在上面创建config.xml文件。如果您搜索的XML文件在浏览器中的文本Configviewer_Model_Observer,你会发现在你的类中列出。每个模块的config.xml文件由Magento解析,并包含在全局配置。
为什么如此重要?
目前为止可能有些难以理解,但是这个配置文件是你学习Magento系统的关键。你添加的任何所有模块都能够在这个配置文件中找到,任何时候当你需要请求核心系统的功能时,Magento都会使用到配置文件。
举个例子,作为一个MVC程序员,你经常会使用到一些助手类,使用如下方式实例化,
|
$
helper_sales
=
new
HelperSales
(
)
;
|
而Magento是抽象化了这个过程,并非使用PHP的类声明方式。在Magento中,上面的助手类对象会使用如下方式实例化,
|
$
helper_sales
=
Mage
::
helper
(
'sales'
)
;
|
通俗的说,这个静态方法将会
- 在配置文件找查找<helpers />节点
- 在<helpers />节点内,查找<sales />节点
- 在<sales />节点内,再查找<class />节点
- 实例化在<class />节点中找到的类
虽然这似乎是一个大量的工作,关键的优势是一直在寻找类名的配置文件中,我们可以重写Magento的核心功能,而无需更改或添加到核心代码。这种“元编程“的方式在PHP中使用的并不多,不过它可以让你明确的扩展你想扩展的任意一个地方。