magento結構解析

2021-08-25 12:17:52 字數 4582 閱讀 6075

magento 模組

由於 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 。所以這只不過是使用者介面上的限制。

magento結構解析

magento 模組 由於 magento 中的一切都是模組而且模組本身又可以有自己的配置檔案和資料庫設定,這樣就允許開發人員對 magento 進行擴充套件。模組結構 下面是 catalog 模組的目錄結構,它包含了模組的所有專案 上面提到的六項 池 code pools magento 中所有的...

magento目錄結構說明

code 所有模組的 池 community 社群的模組 core 核心模組 mage magento的核心包名,官方開發的模組目錄 模組 block 顯示塊的邏輯類 controllers 模組的控制器 data etc 配置檔案目錄 helper 輔助類 model 模型 資料庫及業務邏輯操作 ...

Magento的基本架構解析

magento 是在zend框架基礎上建立起來的,這點保證了 的安全性及穩定性。選擇zend的原因有很多,但是最基本的是因為 zend框架提供了物件導向的 庫並且有很好的團隊支援。通過這個框架,magento 主要圍繞三個基本點建立 靈活性 我們相信每乙個解決方案都像它的商務支援一樣是獨一無二的。m...