magento的配置系統(tǒng)就像是magento的心臟,支撐著magento的運行。這套配置系統(tǒng)掌管著幾乎所有“module/model/class/template/etc”。它把整個magento系統(tǒng)抽象出來,用一個配置文件來描述。這里的“配置文件”并不是一個物理上存在的文件,而是magento根據(jù)當前的系統(tǒng)狀態(tài)動態(tài)生成的一段xml。大多數(shù)的php開發(fā)者并不習慣于這樣抽象層,因為它增加的編程的復雜性。但是這樣的抽象提供了無與倫比的靈活性,允許你覆蓋幾乎任何系統(tǒng)的默認行為。
首先,讓我們寫一個簡單的插件來看看這個所謂的“配置文件”長什么樣。雖然我已經(jīng)提供的現(xiàn)成的代碼,但是還是建議你自己建立這個插件,把整個流程走一遍有助于你的理解。
設(shè)置插件的目錄結(jié)構(gòu)
我們將要創(chuàng)建一個magento的模塊【譯者注: magento的插件不叫plug-in,叫module,翻譯成模塊】。magento的模塊由php和xml文件組成,目的是擴展或者覆蓋系統(tǒng)的行為,比如為訂單增加數(shù)據(jù)模型,更改一個類的方法,或者增加一個全新的功能。【譯者注:magento自帶的那些功能也都是基于模塊的,比如用戶注冊,商品展示,結(jié)賬流程等等。magento給我的感覺就是一切皆模塊,和eclipse的插件體系結(jié)構(gòu)有點像】
大多數(shù)magento的系統(tǒng)模塊的結(jié)構(gòu)和我們將要構(gòu)建的插件的結(jié)構(gòu)是一樣的。magento的系統(tǒng)模塊在以下目錄
app/code/core/mage
每一個子目錄都是一個單獨的模塊。這些模塊是由magento官方開發(fā)的。我們安裝完magento以后,所使用的功能就是來自這些模塊。我們自己創(chuàng)建的模塊應(yīng)該放在如下目錄
app/code/local/packagename
“packagename”應(yīng)該是一個唯一的字符串,用來標識你的代碼。通常人們使用公司名字作為packagename,比如
app/code/local/microsoft
由于我在做我自己的magento項目,我將使用我自己的域名“alanstormdotcom”。 然后,我們要創(chuàng)建以下目錄結(jié)構(gòu)
app/code/local/alanstormdotcom/configviewer/block
app/code/local/alanstormdotcom/configviewer/controllers
app/code/local/alanstormdotcom/configviewer/etc
app/code/local/alanstormdotcom/configviewer/helper
app/code/local/alanstormdotcom/configviewer/model
app/code/local/alanstormdotcom/configviewer/sql
你的插件并不一定需要包含以上所有的目錄,但是為了以后開發(fā)方便,我們還是在一開始就把目錄創(chuàng)建好。接下來我們要創(chuàng)建兩個文件,一個是config.xml,放在etc目錄下面
app/code/local/alanstormdotcom/configviewer/etc/config.xml
文件內(nèi)容如下
[xhtml]view plaincopy
<config> <modules> <alanstormdotcom_configviewer> <version>0.1.0</version> </alanstormdotcom_configviewer> </modules> </config>
第二個文件需要在如下位置創(chuàng)建
app/etc/modules/alanstormdotcom_configviewer.xml
第二個文件應(yīng)該遵循如下命名規(guī)則“packagename_modulename.xml”,文件內(nèi)容如下
[xhtml]view plaincopy
<config> <modules> <alanstormdotcom_configviewer> <active>true</active> <codepool>local</codepool> </alanstormdotcom_configviewer> </modules> </config>
我們先不管這些文件是干什么的,以后會解釋。建立好這兩個文件以后,你的模塊的骨架就已經(jīng)完成了。magento已經(jīng)知道你的模塊存在,但是現(xiàn)在你的模塊不會做任何事情。我們來確認一下magento確實裝載了你的模塊
清空magento緩存 在后臺管理界面,進入 system->configuration->advanced 展開“disable modules output” 確認“alanstormdotcom_configviewer”顯示出來了
如果你看到“alanstormdotcom_configviewer”,那么恭喜你,你已經(jīng)成功創(chuàng)建了你第一個magento模塊!
創(chuàng)建模塊邏輯
我們之前創(chuàng)建的模塊不會做任何事情,下面我們來為這個模塊加入邏輯
1. 檢查“showconfig”查詢字符串是否存在
2. 如果“showconfig”存在,那么檢查“showconfigformat”查詢字符串是否存在
3. 如果“showconfigformat”存在,那么輸出指定格式的配置信息,否則輸出默認格式的配置信息
4. 終止執(zhí)行流程
首先更改我們的config.xml文件
[xhtml]view plaincopy
<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>
然后創(chuàng)建如下文件
alanstormdotcom/configviewer/model/observer.php
輸入以下內(nèi)容
[php]view plaincopy
<?php classalanstormdotcom_configviewer_model_observer{ constflag_show_config=\\\’showconfig\\\’; constflag_show_config_format=\\\’showconfigformat\\\’; private$request; publicfunctioncheckforconfigrequest($observer){ $this->request=$observer->getevent()->getdata(\\\’front\\\’)->getrequest(); if($this->request->{self::flag_show_config}===\\\’true\\\’){ $this->setheader(); $this->outputconfig(); } } privatefunctionsetheader(){ $format=isset($this->request->{self::flag_show_config_format})? $this->request->{self::flag_show_config_format}:\\\R