Magento 模块详解
模塊(module)是Magento的核心。站點(diǎn)上的任何 一個(gè)動(dòng)作(action),無(wú)論是在前臺(tái)和還是在后臺(tái)的每一個(gè)操作都是通過(guò)模塊來(lái)實(shí)現(xiàn)的。模塊是可以視為一個(gè)容器,它可包 含下面這幾項(xiàng):設(shè)置(settings),數(shù)據(jù)庫(kù)模式(database schema), 呈現(xiàn)對(duì)象(rendering object),輔助工具類(utility helpers), 數(shù)據(jù)模型(data models)或動(dòng)作控制器(action controller)。一個(gè)模塊可以包含全部的這六項(xiàng)也可以只包含其中的幾項(xiàng),甚至只有一項(xiàng)。所有的模塊可以通過(guò)app/etc/modules/目錄中XML配置系統(tǒng)來(lái)進(jìn)行開(kāi)關(guān)。每個(gè)模塊 也可以在自己模塊目錄下的etc子目錄中創(chuàng)建一個(gè)XML文件來(lái)保存自己的配置信息。
由于Magento中的一切都是模塊而且模塊本身又可以有自己的配置文件和數(shù)據(jù)庫(kù)設(shè)置,這樣就允許開(kāi)發(fā)人員對(duì)Magento進(jìn)行擴(kuò)展。
模塊結(jié)構(gòu)
下面是Catalog模塊的目錄結(jié)構(gòu),它包含了模塊的所有項(xiàng)目(上面提到的六項(xiàng)):
代碼池(Code Pools)
Magento中所有的模塊被放在三個(gè)代碼池中,它們分別是core,local,community。Magento本身所附帶的模塊全部 放在core代碼池中。你自己開(kāi)發(fā)的模塊則就安裝在local代碼池中。至于community代碼池則是用來(lái)安 裝第三方模塊,但是這種想法也有可能會(huì)過(guò)時(shí),因?yàn)槟K可以安裝在lcoal代碼池,也可以安裝在community代碼池,而并不是必須那樣劃分。
包(Package)
所有的模塊都不是直接保存代碼 池目錄中,而是保存在包目錄(代碼池的子目錄)中。引入包概念的主要目的是類命名的統(tǒng)一和一貫性。所有的Magento模塊是保存在core代碼池中的Mage包中。所以,所有的Magento類名都以Mage_為前綴。而對(duì)我們自己開(kāi)發(fā)的代碼我們應(yīng)該在lcoal代碼池中創(chuàng)建一個(gè)包,比如以你公司的名字作為包名,這樣就可以避免類名的重復(fù)的可能性。
模型(Model)
模型可以說(shuō)是Magento的肌肉。它主要是用來(lái)從數(shù)據(jù)庫(kù)提取數(shù)據(jù)到程序中。數(shù)據(jù)的輸出,呈現(xiàn)是通過(guò)塊(Block)來(lái)實(shí)現(xiàn)的。也就是說(shuō)它主要是用來(lái)負(fù)責(zé)數(shù)據(jù)庫(kù)操作的。事實(shí)上在任何一個(gè)編程環(huán)境中,模型都是被用來(lái)識(shí)別 處理數(shù)據(jù)域的工作,也就是說(shuō)它在數(shù)據(jù)組的定義和其它相關(guān)數(shù)據(jù)組之間起到聯(lián)系的作用。
為了說(shuō)明前面模型化的理論,我 們舉個(gè)例子來(lái)說(shuō)明一下:在創(chuàng)建一個(gè)購(gòu)物車(chē)系統(tǒng)時(shí),我們有一個(gè)Product類。每個(gè)產(chǎn)品需要一個(gè) 指定一個(gè)圖片。問(wèn)題是圖片如何模型化?只是簡(jiǎn)單的給Product類一個(gè)$image_url屬性?還是創(chuàng)建 一個(gè)Image_Gallery類,然后在兩個(gè)類之間創(chuàng)建一個(gè)接口,如getDefaultImage。最終的模型類取決于你決定如何實(shí)現(xiàn)數(shù)據(jù)之間的操作。
塊(Block)
塊是Magento模板模式背后的大腦。所有的塊形成一套嵌套的對(duì)象集協(xié)調(diào)模型和模板文件。每個(gè)塊對(duì)應(yīng)一個(gè)模板文件 —— 模板文件是以.phtml為擴(kuò)展名的html 和php代碼混合的文件。也就是說(shuō)對(duì)于在Magento上的任何一個(gè)請(qǐng)求,其實(shí)你在處理的是一系列的塊對(duì)象和相應(yīng)數(shù)量的模板文件。
Magento的模板系統(tǒng)就是php語(yǔ)言本身。它并沒(méi)有重新實(shí)現(xiàn)一 個(gè)模板系統(tǒng),所以renderView()方法也只不過(guò)是簡(jiǎn)單的調(diào)用include來(lái)包含相關(guān)的模板文件。也就是說(shuō),如果你想使用某個(gè)模板引擎,而不使用單純的php語(yǔ)言,你可以通過(guò)修改Mage_Core_Block_Template類的renderView方法來(lái)調(diào)用你所 選擇的模板系統(tǒng)的呈現(xiàn)函數(shù)。
控制器(Controller)
控制器是Magento所有業(yè)務(wù)邏輯的起點(diǎn)。 業(yè)務(wù)邏輯是指業(yè)務(wù)理論中的規(guī)則。至于
Magento業(yè)務(wù)邏輯和域邏輯(數(shù)據(jù)處理指令)的區(qū)分是不太明顯的。有的人認(rèn)為檢查必須欄位和可選欄位就是屬于 業(yè)務(wù)邏輯,而有人認(rèn)為那應(yīng)該屬于域邏輯。Magento中的大多數(shù)的邏輯的是在模型中實(shí)現(xiàn)的。
控制器類繼承了Mage_Core_Controller_Varien_Action基類,而這個(gè)基類是Zend框架的Zend_Controller_Action類的修改版本。其中比較重要的方法包括:
l dispatch($action)
l preDispatch();
l postDispatch()
其它的方法只是簡(jiǎn)單的利用URL將指令傳遞給系統(tǒng)的其它關(guān)鍵部分。Dispatch()方法啟動(dòng)當(dāng)前請(qǐng)求的所有業(yè)務(wù)邏輯,$action的值是根據(jù)URL決定的,默認(rèn)通常是index。Dispatch方法首先調(diào)用preDispatch方法,而這個(gè)方法則觸發(fā)下面這幾個(gè)事件,你可以偵聽(tīng)這幾個(gè)事件并添加處理代碼:
n controller_action_predispatch
n controller_action_predispatch_ModuleName
n controller_action_predispatch_ModuleName_ControllerName_ActionName
dispatch方法只會(huì)在preDispatch方法末將當(dāng)前 請(qǐng)求標(biāo)記為dispatched時(shí)被調(diào)用,最終它會(huì)調(diào)用相應(yīng)的控制器實(shí)例中對(duì)應(yīng)的action方法,看下圖:
輔助類(Helper)
Magento中的輔助類是用來(lái)將那些輔助接口從內(nèi)核類中提取抽象出來(lái)的途徑。我們通常既有在塊類中,也有在模型 類中調(diào)用輔助類的接口,所以這些接口的返回值是不太可靠的,而且你幾乎不會(huì)去繼承某個(gè)輔助類,因?yàn)槟憧梢灾苯犹砑右粋€(gè)輔助類來(lái)添加新的輔助接口。
不過(guò)你會(huì)感興趣的輔助類的兩個(gè) 重要的接口是:
l __(兩個(gè)下劃線)
l htmlEscape
雙下劃線方法是翻譯接口。它幾 乎被所有的對(duì)象封裝使用,也就是說(shuō)你幾乎可以在代碼中的任何地方調(diào)用這個(gè)方法來(lái)翻譯一個(gè)字符串。htmlEscape只是簡(jiǎn)單封裝了htmlspecialchars函 數(shù),不過(guò)它也可以接收一個(gè)數(shù)組并對(duì)數(shù)組中的每個(gè)元素應(yīng)用htmlspecialchars函 數(shù)。
配置文件(config files)
模塊的配置文件是保存在模塊目 錄下的etc子目錄中。每個(gè)模塊可以有三個(gè)配置文件,它們?nèi)荴ML文件。其中config.xml是直接影響你模塊的行為,其它的兩個(gè)文件system.xml和convert.xml會(huì)自動(dòng)為你在 后臺(tái)配置頁(yè)面創(chuàng)建設(shè)置表單。
所有模塊的配置文件最后會(huì)被組 合到一起。這就意味著你可以在某個(gè)模塊相應(yīng)的XML標(biāo)簽中設(shè)置配置來(lái)重寫(xiě)或覆蓋任何模塊的相應(yīng)配置,這也正是Magento重寫(xiě)的本質(zhì)。
為了某種需要,你可以創(chuàng)建一個(gè) 類,再創(chuàng)建一個(gè)config.xml文件,在其中相同的位置指定你的類名,這樣你就可以你將你的類安裝到系統(tǒng)中。
這也是你為什么會(huì)看見(jiàn)在系統(tǒng)中 到處都有類似getModel(‘catalog/product’)的調(diào)用,而不是簡(jiǎn)單的像這樣的調(diào)用:new Catalog_Model_Product();。
每個(gè)類對(duì)標(biāo)簽,名稱的使用給了 你一個(gè)強(qiáng)大的方式使你可以重寫(xiě)系統(tǒng)中的任何一個(gè)部分。
注:類名中使用標(biāo)簽假定的上下 文件可能是Block,Model,Helper。
模板系統(tǒng)
Magento中的模板系統(tǒng)是很有爭(zhēng)議的。有些用戶對(duì)于使用PHP作為模板系統(tǒng)很有意見(jiàn)。但是使用PHP作為模板系統(tǒng)并沒(méi)有使用模板系統(tǒng)簡(jiǎn)單或功能變得不夠強(qiáng)大,至少?gòu)拈L(zhǎng)遠(yuǎn)看來(lái)不是。在筆者看來(lái)這是最靈 活最高級(jí)的模板系統(tǒng)。
一個(gè)完整的頁(yè)面是通過(guò)一組嵌套 的模板文件來(lái)實(shí)現(xiàn)(理論上講應(yīng)該是一組嵌套的塊對(duì)象)。系統(tǒng)中不會(huì)有“組件”的概念,也就是說(shuō)你不會(huì)有“Form”,“Button”類或?qū)ο蟆D0逦募?塊對(duì)象是通過(guò)一組xml文件控制的,這有利于開(kāi)發(fā)人員開(kāi)發(fā)插件,但是似乎這對(duì)設(shè)計(jì)人員(即使是那些熟悉php的程序員)來(lái)講有點(diǎn)難度。
布局文件(Layout file)
布局文件控制了頁(yè)面的最終結(jié) 構(gòu)。所有的布局文件保存在當(dāng)前主題的layout目錄下。所有布局文件的名稱都和相應(yīng)的模塊名一樣,只不過(guò)它們都使用小寫(xiě),而模塊名使用所謂的駱駝 式命名法。其中最重要的布局文件是page.xml文件
page.xml文件指定了默認(rèn)的頁(yè)面結(jié)構(gòu)。從其它的xml文件的修改是來(lái)自default標(biāo)簽下的設(shè)置。下列是布局文件中常用的標(biāo)簽:
l layout
l default
l reference
l block
l action
l update
你也可能看到類似下面這樣的標(biāo) 簽,這些在Magento中被layout handle,它們的 作用和default標(biāo)簽一樣,但是只會(huì)在某些特定的請(qǐng)求時(shí)起作用。這些標(biāo)簽遵循一個(gè)模式,即和模塊名,控制器名,和action名相關(guān)聯(lián)。如果一個(gè)標(biāo)簽只有兩個(gè)部分,以下劃線分開(kāi),比如cms_page,那么這個(gè)標(biāo)簽下的所有設(shè)置會(huì)應(yīng)用到這個(gè)模塊下的對(duì)應(yīng)控制器下的所有請(qǐng)求。
模板文件
關(guān)于模板文件沒(méi)有太多介紹的, 它們只是簡(jiǎn)單的在html文件中嵌套php代碼的文件,以.phtml為擴(kuò)展名。這些文件中使用了php語(yǔ)法的模板特性,你會(huì)看到PHP的另一個(gè)使用冒號(hào)的循環(huán)結(jié)構(gòu),還有endwhile,endfor,endif。
模板文件的目錄結(jié)構(gòu)模仿對(duì)應(yīng)模 塊的目錄結(jié)構(gòu),但是這并不是必須的。筆者發(fā)現(xiàn),在開(kāi)發(fā)自己的模塊時(shí),不按Magento的習(xí)慣來(lái)命名模板文 件并將它們保存在一個(gè)目錄下會(huì)簡(jiǎn)單的多。你可以將文件名中的斜杠替換成下劃線,這樣就相當(dāng)于模仿了你模塊的文件名。如果你需要重寫(xiě)一組文件,不管是哪里的 文件,不管是幾個(gè)文件,要想直接看到到底重寫(xiě)了哪些文件,最好就是將它們重寫(xiě)并保存在一個(gè)目錄下。
有一些重要的模板文件你需要熟 悉,就是在page目錄下的模板文件。這個(gè)目錄下的所有模板文件在修改你的頁(yè)面時(shí)具有最高的級(jí)別。這些文件指定了哪些 頁(yè)面有1,2或3列,也提供類似dashboard類似的頁(yè)面和打印布局的頁(yè)面。
盡管你可以在你自己的主題的page目錄中添加最高級(jí)別的模板文件,但是只有default界面中default主題中page目錄下的模板文件可以通過(guò)后臺(tái)管理界面來(lái)選擇。比如說(shuō)你想要一個(gè)有四個(gè)列的頁(yè)面結(jié)構(gòu),所以你就創(chuàng)建了4-column.phtml,但是你是不能通過(guò)后臺(tái)管理界面來(lái)選擇這個(gè)模板文件。但是你可以在布局文件中重新(重寫(xiě))定義頁(yè)面結(jié) 構(gòu)為4-column.phtml。所以這只不過(guò)是用戶界面上的限制。
source: ?http://blog.aim-china.com/?cat=3
轉(zhuǎn)載于:https://www.cnblogs.com/wwufengg/articles/magento-module.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Magento 模块详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数字电影打包内容(Packaging)
- 下一篇: Chrome插件:OneNote Web