1、Magento文件目錄結構圖
2、Magento網站運行原理
Magento網站和常規的網站概念是有點不一樣,magento是由很多模塊組成的,你可以自行開發和系統一樣級別的模塊替換系統模塊,所以非常方便進行二次開發和維護!magento的核心模塊page控制着所有頁面的輸出,其他的模塊都是圍繞着更新page模塊的布局文件page.xml來更新網頁的布局來達到自定義頁面功能及顯示效果的。
后台Configuration -> web - default pages可以設置首頁網址的默認模塊及首頁、404等頁面。
假如Default Web URL設置為cms,則首頁布局框架為<cms_index_index>
(1)、一個magento模塊(以banner1為例)的組成由以下文件組成:
系統加載配置文件(app/etc/SCutePHP_Banner1.xml)
模塊主文件夾(app/code/local/SCutePHP/Banner1)
模塊通過模塊文件夾中的etc/config.xml配置文件來配置功能及其布局文件,該模塊布局文件可以更新page.xml布局文件來更新頁面,以及可以關聯對於的模板文件展示效果。
當瀏覽器頁面打開magento網站時,magento先根據(appetcmodules)中的模塊配置文件加載所有對應的模塊,再根據布局文件中的內容更新page.xml布局文件來更新頁面,以及可以關聯對於的模板文件展示效果。
下面是一些行為特性的布局XML標記詳解:
<default>
在加載網店的幾乎所有頁面之前應該加載此特定頁面布局的<default>嵌套更新(我們說'幾乎 所有的',因為一些特殊的頁面像產品圖片彈出窗口就沒有加載布局中的<default>句柄)。
如果Magento找到<default>以外的句柄,它將按照指定的句柄中(<模塊名_頁面>,例如<catalog_product_view>對於產品頁面)的頁面嵌套更新對頁面進行處理。例 如,<catalog_product_view>包含Product View產品詳細頁面的布局更新,而<catalog_product_compare_index>包含Compare Product 頁面的更新布局。
<block>
Magento通過<block>標記決定頁面中的每個區塊的行為和視覺表現。在Magento中我們已經提到了兩種類型的區塊-結構區塊(structural blocks)和內 容區塊(content blocks)。區分這兩種區塊最好的方式是通過分配給它的標記屬性來區分。結構區塊通常包含屬性'as',通過這個屬性值程序可以在模板中(由getChildHTML 方法指定)通過as值調用,或者也可以在指定布局文件中通過name屬性值用<reference>調用(如下圖)。
讓我們進一步挖 掘<block>的現有屬性。
type – 這是模塊類的標識符,它定義了區塊的功能,對應與該模塊包文件夾中的block文件夾中的相應類函數。此屬性不應該被修改。
name – 這是名稱,其他的區塊可以通過此名稱引用此區塊(看圖)。
before (and) after – 這兩種方法決定內容區塊在結構區塊中的位置。before="-" 和 after="-"這樣的命令標志此區塊的位置是一個結構區塊的最上方或最下方。
template - 這個屬性指定的值決定了此區塊的功能是使用哪個模板。例如,如果這個屬性值指定了'catalog/category/view.phtml ', 程序就會載入‘app/design/frontend/template/catalog/category/view.phtml ’ 模板文件。
action – <action> 是用來控制前台的功能的,如加載或不加載一個javascript。最佳的學習途徑是了解現有的布局更新 上面的不同Action方法。
as – 此屬性指 定模板文件中會調用那個區塊。當您在模板中看到getChildHtml(' block_name ')的PHP方法,可以肯定它指的是引用屬性'as'的值為' block_name '的區塊。 (例如:在骨架模板中的方法<?=$this->getChildHtml('header')?>是調用<block as=“header”>)
<reference>
<reference>是用來引用另一個區塊。要引用另外一個區塊,在內部的更新將應用於與其關聯的<block>(見圖 )。
要使用引用,可以通過區塊中的‘name’屬性值引用。此屬性的指向標簽中'name'屬性。所以,如果你使用<reference name="right">,響應的區塊名稱將是<block name="right">。
3、URL路由與分發器
Magento也采用單入口文件模式,根據不同參數調用相應的模塊。例如:http://127.0.0.1/index.php/customer/account/login首先接收customer參數,根據該參數查找到app/code/core/mage/customer模塊。接着查找第二個account參數,我們繼續在customer模塊下查找。該參數默認調用customer模塊下的controller/AccountController.php文件。
接着查找第三個login參數,相信你已經明白了吧!在controller/AccountController.php下的loginAction方法。
根據調用方法查找模板:我們繼續使用上面的例子,如果我們查找到customer模塊,對應的模板目錄在app/design/frontend/default/你的主題/layout/customer.xml,如果不存在該文件,系統會向app/design/frontend/default/default/layout/customer.xml中查找,如果該目錄還不存在會向app/design/frontend/base/default/layout/customer.xml中查找。找到該文件后,根據account參數,magento會查找到標簽;根據login參數,magento會查找到標簽,並加載里面相應的區塊。如果不明白沒有關系,在此你只需要知道如何根據URL參數調用對應的xml文件即可。
模板調用對應的js、CSS、圖片:模板是如何加載這些文件的呢?
Js和css文件是通過app/design/frontend/default/你的主題/layout/page.xml文件加載的。當然也可以直接寫到模板文件里。加載的js和css目錄放在/skin/fronted/default/你的主題/下。
如果不存在該目錄,會向/skin/fronted/base/default/目錄查找。跟模板的繼承機制是一樣。
重寫核心模塊:如果你要修改app/code/core/mage/customer/controller/AccountController.php文件。你可以復制AccountController.php這個文件放到app/code/local/Company/customer/controller/AccountController.php;app/code/local/Company/customer/etc/customer.xml;
重寫controller類
require_once "Mage/Checkout/controllers/OnepageController.php";
class Company_Xcheckout_OnepageController extends Mage_Checkout_OnepageController{
//do what you want //盡情發揮吧
}
重寫block類
require_once "Mage/core/Checkout/Block/Onepage.php";
class Company_Xcheckout_Block_Onepage extends Mage_Checkout_Block_Onepage_Abstract{ … }