Magento模組 -- Magento模組學習教程
Magento 模組
模組( module )是 Magento 的核心。網站上的任何一個動作( action ),無論是在前台和還是在背景每一個操作都是通過模組來實現的。模組是可以視為一個容器,它可包含下面這幾項:設定 (settings) ,資料庫模式 (database schema) ,呈現對象 (rendering object) ,協助工具輔助類 (utility helpers) ,資料模型 (data models) 或動作控制器 (action controller) 。一個模組可以包含全部的這六項也可以只包含其中的幾項,甚至只有一項。所有的模組可以通過 app/etc/modules/ 目錄中 XML 配置系統來進行開關。每個模組也可以在自己模組目錄下的 etc 子目錄中建立一個 XML 檔案來儲存自己的配置資訊。
由於 Magento 中的一切都是模組而且模組本身又可以有自己的設定檔和資料庫設定,這樣就允許開發人員對 Magento 進行擴充。
模組結構
下面是 Catalog 模組的目錄結構,它包含了模組的所有項目(上面提到的六項):
代碼池 (Code Pools)
Magento 中所有的模組被放在三個代碼池中,它們分別是 core , local , community 。 Magento 本身所附帶的模組全部放在 core 代碼池中。你自己開發的模組則就安裝在 local 代碼池中。至於 community 代碼池則是用來安裝第三方模組,但是這種想法也有可能會過時,因為模組可以安裝在 lcoal 代碼池,也可以安裝在 community 代碼池,而並不是必須那樣劃分。
包 (Package)
所有的模組都不是直接儲存代碼池目錄中,而是儲存在包目錄(代碼池的子目錄)中。引入包概念的主要目的是類命名的統一和一貫性。所有的 Magento 模組是儲存在 core 代碼池中的 Mage 包中。所以,所有的 Magento 類名都以 Mage_ 為首碼。而對我們自己開發的代碼我們應該在 lcoal 代碼池中建立一個包,比如以你公司的名字作為包名,這樣就可以避免類名的重複的可能性。
模型 (Model)
模型可以說是 Magento 的肌肉。它主要是用來從資料庫提取資料到程式中。資料的輸出,呈現是通過塊 (Block) 來實現的。也就是說它主要是用來負責資料庫操作的。事實上在任何一個編程環境中,模型都是被用來識別處理資料域的工作,也就是說它在資料群組的定義和其它相關資料群組之間起到聯絡的作用。
為了說明前面模型化的理論,我們舉個例子來說明一下:在建立一個購物車系統時,我們有一個 Product 類。每個產品需要一個指定一個圖片。問題是圖片如何模型化?只是簡單的給 Product 類一個 $image_url 屬性?還是建立一個 Image_Gallery 類,然後在兩個類之間建立一個介面,如 getDefaultImage 。最終的模型類取決於你決定如何?資料之間的操作。
塊 (Block)
塊是 Magento 模板模式背後的大腦。所有的塊形成一套嵌套的對象集協調模型和模板檔案。每個塊對應一個模板檔案 ——模板檔案是以 .phtml 為副檔名的 html 和 php 代碼混合的檔案。也就是說對於在 Magento 上的任何一個請求,其實你在處理的是一系列的塊對象和相應數量的模板檔案。
Magento 的模板系統就是 php 語言本身。它並沒有重新實現一個模板系統,所以 renderView() 方法也只不過是簡單的調用 include 來包含相關的模板檔案。也就是說,如果你想使用某個模板引擎,而不使用單純的 php 語言,你可以通過修改 Mage_Core_Block_Template 類的 renderView 方法來調用你所選擇的模板系統的呈現函數。
控制器 (Controller)
控制器是 Magento 所有商務邏輯的起點。商務邏輯是指業務理論中的規則。至於
Magento 商務邏輯和域邏輯(資料處理指令)的區分是不太明顯的。有的人認為檢查必須欄位和可選欄位就是屬於商務邏輯,而有人認為那應該屬於域邏輯。 Magento 中的大多數的邏輯的是在模型中實現的。
控制器類繼承了 Mage_Core_Controller_Varien_Action 基類,而這個基類是 Zend 架構的 Zend_Controller_Action 類的修改版本。其中比較重要的方法包括:
l dispatch($action)
l preDispatch();
l postDispatch()
其它的方法只是簡單的利用 URL 將指令傳遞給系統的其它關鍵區段。 Dispatch() 方法啟動當前請求的所有商務邏輯, $action 的值是根據 URL 決定的,預設通常是 index 。 Dispatch 方法首先調用 preDispatch 方法,而這個方法則觸發下面這幾個事件,你可以偵聽這幾個事件並添加處理代碼:
n controller_action_predispatch
n controller_action_predispatch_ModuleName
n controller_action_predispatch_ModuleName_ControllerName_ActionName
dispatch 方法只會在 preDispatch 方法末將當前請求標記為 dispatched 時被調用,最終它會調用相應的控制器執行個體中對應的 action 方法,看:
輔助類 (Helper)
Magento 中的輔助類是用來將那些輔助介面從核心類中提取抽象出來的途徑。我們通常既有在塊類中,也有在模型類中調用輔助類的介面,所以這些介面的傳回值是不太可靠的,而且你幾乎不會去繼承某個輔助類,因為你可以直接添加一個輔助類來添加新的輔助介面。
不過你會感興趣的輔助類的兩個重要的介面是:
l __( 兩個底線 )
l htmlEscape
雙底線方法是翻譯介面。它幾乎被所有的對象封裝使用,也就是說你幾乎可以在代碼中的任何地方調用這個方法來翻譯一個字串。 htmlEscape 只是簡單封裝了 htmlspecialchars 函數,不過它也可以接收一個數組並對數組中的每個元素應用 htmlspecialchars 函數。
設定檔 (config files)
模組的設定檔是儲存在模組目錄下的 etc 子目錄中。每個模組可以有三個設定檔,它們全是 XML 檔案。其中 config.xml 是直接影響你模組的行為,其它的兩個檔案 system.xml 和 convert.xml 會自動為你在後台配置頁面建立設定表單。
所有模組的設定檔最後會被組合到一起。這就意味著你可以在某個模組相應的 XML 標籤中設定配置來重寫或覆蓋任何模組的相應配置,這也正是 Magento 重寫的本質。
為了某種需要,你可以建立一個類,再建立一個 config.xml 檔案,在其中相同的位置指定你的類名,這樣你就可以你將你的類安裝到系統中。
這也是你為什麼會看見在系統中到處都有類似 getModel(‘catalog/product’) 的調用,而不是簡單的像這樣的調用: new Catalog_Model_Product(); 。
每個類對標籤,名稱的使用給了你一個強大的方式使你可以重寫系統中的任何一個部分。
註:類名中使用標籤假定的上下檔案可能是 Block , Model , Helper 。
模板系統
Magento 中的模板系統是很有爭議的。有些使用者對於使用 PHP 作為模板系統很有意見。但是使用 PHP 作為模板系統並沒有使用模板系統簡單或功能變得不夠強大,至少從長遠看來不是。在筆者看來這是最靈活最進階的模板系統。
一個完整的頁面是通過一組嵌套的模板檔案來實現(理論上講應該是一組嵌套的塊對象)。系統中不會有“組件”的概念,也就是說你不會有“ Form ”,“ Button ”類或對象。模板檔案和塊對象是通過一組 xml 檔案控制的,這有利於開發人員開發外掛程式,但是似乎這對設計人員(即使是那些熟悉 php 的程式員)來講有點難度。
布局檔案 (Layout file)
布局檔案控制了頁面的最終結構。所有的布局檔案儲存在當前主題的 layout 目錄下。所有布局檔案的名稱都和相應的模組名一樣,只不過它們都使用小寫,而模組名使用所謂的駱駝式命名法。其中最重要的布局檔案是 page.xml 檔案
page.xml 檔案指定了預設的頁面結構。從其它的 xml 檔案的修改是來自 default 標籤下的設定。下列是布局檔案中常用的標籤:
l layout
l default
l reference
l block
l action
l update
你也可能看到類似下面這樣的標籤,這些在 Magento 中被 layout handle ,它們的作用和 default 標籤一樣,但是只會在某些特定的請求時起作用。這些標籤遵循一個模式,即和模組名,控制器名,和 action 名相關聯。如果一個標籤只有兩個部分,以底線分開,比如 cms_page ,那麼這個標籤下的所有設定會應用到這個模組下的對應控制器下的所有請求。
模板檔案
關於模板檔案沒有太多介紹的,它們只是簡單的在 html 檔案中嵌套 php 代碼的檔案,以 .phtml 為副檔名。這些檔案中使用了 php 文法的模板特性,你會看到 PHP 的另一個使用冒號的迴圈結構,還有 endwhile,endfor,endif 。
模板檔案的目錄結構模仿對應模組的目錄結構,但是這並不是必須的。筆者發現,在開發自己的模組時,不按 Magento 的習慣來命名模板檔案並將它們儲存在一個目錄下會簡單的多。你可以將檔案名稱中的斜杠替換成底線,這樣就相當於模仿了你模組的檔案名稱。如果你需要重寫一組檔案,不管是哪裡的檔案,不管是幾個檔案,要想直接看到到底重寫了哪些檔案,最好就是將它們重寫並儲存在一個目錄下。
有一些重要的模板檔案你需要熟悉,就是在 page 目錄下的模板檔案。這個目錄下的所有模板檔案在修改你的頁面時具有最高的層級。這些檔案指定了哪些頁面有1,2或3列,也提供類似 dashboard 類似的頁面和列印布局的頁面。
儘管你可以在你自己的主題的 page 目錄中添加最進階別的模板檔案,但是只有 default 介面中 default 主題中 page 目錄下的模板檔案可以通過後台管理介面來選擇。比如說你想要一個有四個列的頁面結構,所以你就建立了 4-column.phtml ,但是你是不能通過後台管理介面來選擇這個模板檔案。但是你可以在布局檔案中重新(重寫)定義頁面結構為 4-column.phtml 。所以這隻不過是使用者介面上的限制。
Mage 應用程式