Magento中文開(kāi)發(fā)手冊(cè)開(kāi)篇_第1頁(yè)
Magento中文開(kāi)發(fā)手冊(cè)開(kāi)篇_第2頁(yè)
Magento中文開(kāi)發(fā)手冊(cè)開(kāi)篇_第3頁(yè)
Magento中文開(kāi)發(fā)手冊(cè)開(kāi)篇_第4頁(yè)
Magento中文開(kāi)發(fā)手冊(cè)開(kāi)篇_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Magent。(麥進(jìn)斗)是這個(gè)星球上最強(qiáng)大的購(gòu)物車網(wǎng)店平臺(tái)。當(dāng)然,你應(yīng)當(dāng)已經(jīng)對(duì)此亳無(wú)疑問(wèn)

To不過(guò),你可能還不知道,Magento(麥進(jìn)斗)同樣是一個(gè)面對(duì)對(duì)象的PHP框架。你可以

辦作Magento(麥進(jìn)斗)購(gòu)物車程序強(qiáng)大的功能,開(kāi)發(fā)動(dòng)態(tài)WEB應(yīng)用程序。

采納高端Magento(麥進(jìn)斗)電子商務(wù)系統(tǒng)可訂制對(duì)接企業(yè)ERP、CRM如:SAPNAVSalesforce

Odoo用友金蝶等,Magento(麥進(jìn)斗)可對(duì)接淘寶、京東、Amazon、eBay、Wish、速賣通

等電子商務(wù)銷售平臺(tái),Magento(麥進(jìn)斗)還可訂制對(duì)接開(kāi)發(fā)微信商城、移動(dòng)電商APP。

相較于老的ecshop構(gòu)架,Magento(麥進(jìn)斗)作為全球第一電商平臺(tái)可供應(yīng)完整核心源代碼的

電商解決方案,適合品牌企業(yè)、跨國(guó)企業(yè)、跨境電商企業(yè)。麥進(jìn)斗科技供應(yīng)上訴完整電商解

決方案,歡迎詢問(wèn)聯(lián)系麥進(jìn)斗

這是Magento中文開(kāi)發(fā)手冊(cè)的開(kāi)篇,我們會(huì)在整個(gè)手冊(cè)中介紹絕大部分Magento的開(kāi)發(fā)框

架特性。不要想在這片文章中立即駕馭全部的特性。這僅僅是個(gè)起先,但是足夠讓你在同行

中鶴立雞群了。

在這片文章中,你將了解到:

Magento模塊(MagentoModules)代碼組織形式

配置型MVC架構(gòu)

Magento限制器(MagentoControllers)

基于URI的模型實(shí)例化(Context-basedURIModelLoading)

Magento模型(MagentoModels)

Magento助手(MagentoHelpers)

Magento布局(MagentoLayouts)

事務(wù)監(jiān)聽(tīng)(Observers)

Magento類重寫(ClassOverrides)

總結(jié)

起先之前,你可以試著看下MagentoMVC模式的一個(gè)圖形化直觀體現(xiàn)。Magento_MVC.pdf

Magento模塊中的代碼組織形式

Magento通過(guò)將代碼放入獨(dú)立的模塊進(jìn)行組織。在一個(gè)典型的PHPMVC應(yīng)用中,全部的限

制器會(huì)被放在一個(gè)文件夾中,全部的模型會(huì)被放在另外一個(gè)文件夾里,等等。而在Magento

中,文件是基于功能進(jìn)行分組的,這種分組后的代碼塊叫做模塊。

Magento的代碼:

舉例來(lái)說(shuō),假如你想找尋Magento中關(guān)于付款的功能,你僅僅須要找到下面代碼中的文件

夾,就能獲得全部的限制器,模型,助手,Blocks等。

app/code/core/Mage/Checkout

假如你想找尋Magento中關(guān)于GoogleCheckout的功能,也僅僅須要找到如下文件夾,即可

獲得全部你想要的信息。

app/code/core/Mage/GoogleCheckout

你的代碼:

假如你想擴(kuò)展Magento,千萬(wàn)不要想當(dāng)然的去修改core文件夾中的文件,也不要將你自己

的限制器,模型,助手或者Blocks放在Core文件夾中。全部對(duì)于Magent。的擴(kuò)展,都將在

local文件夾中進(jìn)行。

app/code/local/<Package>/<Modulename>

Package(也可稱為命名空間,當(dāng)然這不是PHP手冊(cè)中提到的命名空間)是唯一的命名,通

過(guò)Package來(lái)標(biāo)識(shí)你的公司,組織或個(gè)人。通過(guò)Package,世界范圍內(nèi)的Magento社區(qū)在創(chuàng)

建模塊擴(kuò)展時(shí),能夠運(yùn)用他們自己的Package名稱,以避開(kāi)及其他開(kāi)發(fā)者有命名沖突。

創(chuàng)建一個(gè)新的模塊時(shí),你須要告知Magent。新模塊的相關(guān)信息??梢酝ㄟ^(guò)添加一個(gè)XML文

件在下面的書目中。

app/etc/modules

在這個(gè)書目中有兩類xml文件,第一種用來(lái)開(kāi)啟獨(dú)立的模塊,以下列方式命名:

Packagename_Modulename.xml

其次種文件用來(lái)從一個(gè)Package中開(kāi)啟多個(gè)模塊,以下列方式命名:

Packagename_All.xml

配置型MVC系統(tǒng)

Magento是一個(gè)配置型MVC(ConfigurationbasedMVC)系統(tǒng)。另夕I?種MVC系統(tǒng)則是大部

分PHP框架運(yùn)用的,約定性MVC(convertion-basedMVC)。

在約定型MVC系統(tǒng)中,假如你添加一個(gè)限制器,或者一個(gè)模型,只須要依據(jù)約定的內(nèi)容,

創(chuàng)建這個(gè)文件以及類即可,系統(tǒng)會(huì)自動(dòng)識(shí)別它。

而在配置型MVC系統(tǒng)中,比如Magento,除了須要添加相應(yīng)的文件及類之外,還須要明確

的告知系統(tǒng)該類的存在。在Magento中,每個(gè)模塊都有一個(gè)config.xml文件。這個(gè)文件中包

含了一個(gè)模塊相關(guān)的配置信息。在運(yùn)行時(shí),全部模塊的配置文件,都會(huì)被加載到一個(gè)巨大的

配置文件樹(shù)中(后面的文章會(huì)介紹如何查看這個(gè)配置樹(shù))。

比如,想在模塊中運(yùn)用模型。你須要添加類似下面的代碼,來(lái)告知Magento你會(huì)在這個(gè)模

塊中運(yùn)用這個(gè)模型。

<models>

〈packagename〉

<class>Packagename_Modulename_Model</class>

</packagename>

<models>

當(dāng)然,這種配置不僅限于模型,對(duì)于限制器,助手,Blocks,路由,事務(wù)句柄等都須要在該

模塊的config.xml中進(jìn)行相關(guān)的配置。

Magento限制器(MagentoControllers)

在任何PHP系統(tǒng)當(dāng)中,核心文件確定是PHP文件。Magento也不例外,index.php是Magento

的核心文件。

不過(guò),恒久不要編輯index.php中的任何代碼。在MVC系統(tǒng)中,index.php的左右也許有以

下幾項(xiàng):

檢測(cè)URL地址。

依據(jù)路由規(guī)則,將訪問(wèn)的URL地址分發(fā)到限制器類中的方法。

初始化限制器,并調(diào)用相應(yīng)的動(dòng)作方法。這一步驟叫做分發(fā)。Dispatchingo

這意味著Magento(或任何MVC系統(tǒng))每一個(gè)有效的entrypoint都是限制器文件中的一個(gè)

方法。一起來(lái)看下面這個(gè)URL:

上述域名后URL地址可以被分拆為以下幾個(gè)部分。

FrontName-catalog

該URL的第一部分被稱為FrontName.它用來(lái)指示Magento應(yīng)當(dāng)在哪個(gè)模塊中找尋URL中

的限制器。在這個(gè)例子中,catalog就是FrontName,對(duì)應(yīng)于catalog模塊。

ControllerName-Category

其次部分指示Magento應(yīng)當(dāng)匹配的限制器。每個(gè)擁有限制器的模塊都包含一個(gè)‘controllers'

的文件夾,用來(lái)存放該模塊下的全部限制器。上述URL地址,匹配了下面這個(gè)限制器文件。

app/code/core/Mage/Catalog/controllers/CategoryController.php

其中的類定義格式也許為:

classMage_Catalog_CategoryControllerextendsMage_Core_Controller_Front_Action

)

在Magento中,全部的限制器都繼承自Mage_Core_controller_Front_Action類。

ActionName-view

第三部分是一個(gè)action方法的名稱。在此URL中,view便是一個(gè)action方法的名字。

classMage_Catalog_CategoryControllerextendsMage_Core_Controller_Front_Action{

publicfunctionviewAction(){

)

}

Paramater/Value-id/25

任何位于action方法名之后的路徑,都會(huì)被認(rèn)為是key/value形式傳遞的GET變量。那么在

我們的例子當(dāng)中,'id啟5'表示有一個(gè)值為25的$_6£?。畚?]變量。

如前所述,假如你想讓自定義模塊運(yùn)用限制器,你必需對(duì)它進(jìn)行配置。下面是在模塊中開(kāi)啟

限制器的代碼。

<frontend>

<routers>

<catalog>

<use>standard</use>

<args>

<module>Mage_Catalog</module>

<frontName>catalog</frontName>

</args>

</catalog>

</routers>

</frontend>

現(xiàn)在不清晰上述內(nèi)容都是什么意思還沒(méi)關(guān)系,但是留意<frontName>catalog</frontName>。

這是用來(lái)關(guān)聯(lián)模塊及URL地址中frontname的。Magento核心代碼選擇將一個(gè)模塊的名字及

frontname一樣,但這不是強(qiáng)制規(guī)定的。

MultipleRouters

上面提到的路由規(guī)則主要是針對(duì)Magento購(gòu)物車程序(即你所能看到的前端)。假如Magento

在URL中無(wú)法匹配到正確的限制罌/動(dòng)作,它會(huì)嘗試運(yùn)用針對(duì)Admin程序(后臺(tái)管理端)的

另?套路由規(guī)則。假如照舊無(wú)法正確匹配,它會(huì)運(yùn)用?個(gè)特別的限制器

Mage_Cms_lndexControllero

CMS限制器會(huì)檢查Magento內(nèi)容管理系統(tǒng)中是否有內(nèi)容須要輸出,假如有內(nèi)容輸出,則讀

取該內(nèi)容,假如找不到,則輸出44頁(yè)面。

例如,Magento默認(rèn)的首頁(yè)就是在運(yùn)用CMS限制器。

Context-BasedURI模型讀取

目前為止,我們已經(jīng)建立了一個(gè)限制器以及一個(gè)方法,到實(shí)例化一個(gè)類做點(diǎn)什么的時(shí)候了。

Magento供應(yīng)了一種特別的方式去實(shí)例化模型,助手以及Blocks,即運(yùn)用Mage全局類供應(yīng)

的靜態(tài)工廠方法。例如,

Magc::gctModcl('catalog/product');

Mage::helper('catalog/product');

<catalog/product,字符串被稱為GroupedClassName。通常叫做URI。GroupedClassName

的第一部分用來(lái)指示該類存在于哪個(gè)模塊當(dāng)中。其次部分用來(lái)確定哪個(gè)類將被調(diào)用。

那么,上述例子中,'catalog'對(duì)應(yīng)于app/code/core/Mage/Catalog模塊,也就意味著我們的

類名將以MagjCatalog開(kāi)頭,然后依據(jù)調(diào)用的類型,將product類名加入到最終一部分。即,

Mage::getModel('catalog/product');

Mage_Catalog_Model_Product;

Mage::helper('catalog/product');

Mage_Catalog_Helper_Product;

Magento模型

和現(xiàn)在的多數(shù)框架一樣,Magento也供應(yīng)ORM支持。ORM讓你能夠?qū)W⒂跀?shù)據(jù),而非無(wú)盡

的SQL語(yǔ)句。例如,

$model=Mage::getModel('catalog/product')->load(27);

$price=$model->getPrice();

$price+=5;

$model->setPrice($price)->setSku('SK1231414,);

$model->save();

在上面這個(gè)例子中,我們調(diào)用了“getPrice”和“setPrice”方法。然而,在

Mage_Catalog_Model_Product類中并沒(méi)有此方法。那為什么上面這個(gè)例子能夠運(yùn)用這些方法

呢?因?yàn)镸agento的ORM系統(tǒng)中運(yùn)用了PHP的_get和_set魔術(shù)方法。

調(diào)用$product->getPrice()會(huì)獲得模型屬性price,而調(diào)用$product->setPrice()會(huì)設(shè)置price屬性。

當(dāng)然,全部的這些都假設(shè)模型類沒(méi)有g(shù)etPrice和setPrice方法。假如它們存在于模型類中,

PHP魔術(shù)方法會(huì)被忽視。假如你有愛(ài)好知道這是如何實(shí)現(xiàn)的,可以參考Varien_Object類,

全部的模型類都繼承自該類。

假如你想獲得模型當(dāng)中全部的數(shù)據(jù),可以干脆調(diào)用$pr。duct?>getData。方法,它會(huì)返回包含

全部字段的一個(gè)數(shù)組。

你可能已經(jīng)留意到上例中的方法存在運(yùn)用。符號(hào)鏈接的形式:

$model->setPrice($price)->setSku(*SK12312542/);

能夠運(yùn)用這種方式調(diào)用方法,最主要的緣由是全部的set方法都會(huì)返回一個(gè)模型的實(shí)例。你

會(huì)常常在Magento的核心代碼中看到此類調(diào)用方法的形式。

Magento的ORM系統(tǒng)中還包含一種通過(guò)Collections接口查詢多個(gè)對(duì)象的方式。下例會(huì)讀取

系統(tǒng)中全部5美元的產(chǎn)品。

$product_collection=Mage::getModel('catalog/product')

->getCollection()

->addAttributeToSelect('*')

^addFieldToFilterfprice'/S.OO');

這里我們又一次看到了鏈接調(diào)用方法的形式。CollectionsusethePHPStandardLibraryto

implementObjectsthathavearraylikeproperties.(這句超出理解范圍)。

foreach($products_collectionas$product)

echo$product->getName{);

}

在上面的個(gè)例了當(dāng)中,你可能留意到了addAttributeToSelect方法。這里單獨(dú)提到此方法,

是因?yàn)樗砹薓agento模型中的一個(gè)類別。Magento擁有兩種形式的模型對(duì)象。一種是

傳統(tǒng)的“一個(gè)對(duì)象,一張表”的ActiveRecord模型。當(dāng)你實(shí)例化這些模型的時(shí)候,全部的屬

性都會(huì)被自動(dòng)選取。

Magento中其次種模型叫做EntityAttributeValue(EAV)模型。這種模型會(huì)依據(jù)確定的規(guī)律

將數(shù)據(jù)分散存儲(chǔ)在數(shù)據(jù)庫(kù)不同的表中。EAV模型的高級(jí)特性,讓Magent。不用在增加一種產(chǎn)

品屬性的時(shí)候變更數(shù)據(jù)庫(kù)模型(一般的購(gòu)物車系統(tǒng)在增加新的屬性時(shí),有兩種方式,一種是

增加數(shù)據(jù)庫(kù)字段,一種是運(yùn)用預(yù)留的空字段。),從而保證了Magento系統(tǒng)的高度擴(kuò)展性。

當(dāng)創(chuàng)建一個(gè)EAV模型的collection時(shí),Magento會(huì)conservativein它會(huì)查詢的字段數(shù),全部你

可以運(yùn)用addAttributeToSelect來(lái)制定你想獲得的列,或者運(yùn)用addAttrbuteToSelect(*)來(lái)獲得

全部列。

MagentoHelpers助手

Magento的助手類包含一系列好用的方法,通過(guò)這些方法可以對(duì)對(duì)象及變量做日常性的操

作。例如,

$helper=Mage::helper('catalog');

是否留意到這里舍棄了GroupedClassName的其次部分?每個(gè)模塊都有一個(gè)默認(rèn)的data助

手類。下面的語(yǔ)句及上面的作用是相同的,即默認(rèn)運(yùn)用模塊下的data助手類。

$helper=Mage::helper('catalog/data');

大部分的助手類繼承自Mage_Core_Helper_Abstract,默認(rèn)供應(yīng)了很多運(yùn)用的方法。

$translated_output=$helper->_('MagentoisGreat');

if($helper->isModuleOutputEnabled()){

}

MagentoLayout布局

目前為止,我們已經(jīng)介紹了限制器,模型以及助手。在典型的PHPMVC系統(tǒng)當(dāng)中,在操作

模型之后,一般會(huì)

傳遞變量到視圖中。

系統(tǒng)會(huì)自動(dòng)讀取默認(rèn)的外層布局

接著將視圖讀取到外層布局中

不過(guò),假如你細(xì)致視察Magent。限制器動(dòng)作方法,你不會(huì)看到這些步驟,

publicfunctiongalleryAction(){

if(!$this->_initProduct()){

if(isset($_GET['store'])&&!$this->getResponse()->isRedirect()){

$this->redirect(");

}elseif(!$this->getResponse()->isRedirect()){

$this->_forward('noRoute');

)

return;

)

$this->loadLayout();

$this->renderLayout();

}

不同于典型PHPMVC形式的是,限制器動(dòng)作方法,以兩個(gè)輸出布局的方法結(jié)束。所以說(shuō),

MagentoMVC系統(tǒng)中的V視圖部分可能及你常常運(yùn)用的大相徑庭,因?yàn)?,你必需在限制?/p>

中明確的輸出布局。

并且,Magento的布局本身也區(qū)分及你常常運(yùn)用的MVC系統(tǒng)。Magento布局是一個(gè)包含嵌

套或者樹(shù)狀的Block對(duì)象的對(duì)象。每一個(gè)Block對(duì)象輸出一部分HTML,輸出HTML的環(huán)節(jié)包

含兩個(gè)部分,PHP代碼組成的Block以及.phtml模板文件。

Blocks對(duì)象負(fù)責(zé)及Magento系統(tǒng)交互并從模型中獲得數(shù)據(jù),而phtml模板文件則為頁(yè)面生成

必需的HTML代碼。

例如,頁(yè)面頭部Block文件app/code/core/Mage/Page/Block/Html/Head.php運(yùn)用及其對(duì)應(yīng)的

page/html/head.phtml模板文件。

換種方式說(shuō)的話,Blocks類就像迷你限制器,而.phtml文件就是視圖文件。

默認(rèn)的,當(dāng)你調(diào)用,

1

2

$this->loadLayout();

$this->renderLayout();

MagentowillloadupaLayoutwithaskeletonsitestructure(此段能夠理解,但想不到最佳翻

譯,也許意思是Magento會(huì)讀取網(wǎng)站的布局框架)。這些結(jié)構(gòu)Blocks用來(lái)輸出head,body

以及設(shè)定單欄或多欄的布局。另外,還有一些內(nèi)容Blocks負(fù)責(zé)實(shí)際輸出像導(dǎo)航,產(chǎn)品分類

等。

“結(jié)構(gòu)”和“內(nèi)容”Blocks在布局系統(tǒng)中是隨意設(shè)置的。一般不會(huì)在代碼中刻意添加代碼,

從而區(qū)分一個(gè)Block是結(jié)構(gòu)還是內(nèi)容,但是Blocks要么屬于“結(jié)構(gòu)”,要么屬于“內(nèi)容”。

為了添加一個(gè)內(nèi)容Blocks到布局中,你須要告知Magento系統(tǒng)

“Magento,快把這幾個(gè)Blocks添加到內(nèi)容Block里”

或者

aMagento,把這邊兒個(gè)Blocks放到“左邊欄”結(jié)構(gòu)Block里”

這些可以通過(guò)限制器中的代碼進(jìn)行限制,

publicfunctionindexAction(){

$block=$this->getLayout()->createBlock('adminhtml/system_account_edit');

$this->getLayout()->getBlock('content')->append($block);

}

但是更常用的方式(至少在前臺(tái)購(gòu)物車應(yīng)用中)是運(yùn)用基于XML文件的布局系統(tǒng)。

在一款風(fēng)格中,基于XML文件的布局允許你刪除正常輸出的Blocks或者添加默認(rèn)的skeleton

區(qū)域(即StructureBlocks)。例如下面這個(gè)XML布局文件,

<catalog_category_default>

<referencename="left">

<blocktype="catalog/navigation"name="catalog.leftnav"after="currency"

template="catalog/navigation/left.phtmr,/>

</reference>

</catalog_category_default>

上面這段代碼的作用是,在catalog模塊的category限制器的默認(rèn)動(dòng)作方法中,將

catalog/navigationBlock插入到左邊欄結(jié)構(gòu)Block中,并運(yùn)用catalog/navigation/left.phtml模

板文件。

關(guān)于Blocks還有一個(gè)比較重要的特性。在模板文件中,你會(huì)看到很多類似下面的代碼,

1

$this->getChildHtml('orderJtems')

這是Block輸出套嵌Block的方式。但是,只有在XML布局文件中明確聲明一個(gè)Block包含

另一個(gè)子Block時(shí),才能在模板文件中通過(guò)gctChildHtml。方法調(diào)用子Block的模板文件。

例如,在XML布局文件中,

<catalog_category_default>

<referencename="left">

<blocktype="catalog/navigation"name="catalog.leftnav"after="currency"

template="catalog/navigation/left.phtml">

<blocktype="core/template"name="foobar"template="foo/baz/bar.phtmr'/>

</block>

</reference>

</catalog_category_default>

那么從catalog/navigationBlock中,我們才可以調(diào)用$m$->8?1:0|同1411('foobar');

Observers視察者

和很多優(yōu)秀的面對(duì)對(duì)象系統(tǒng)一樣,Magento通過(guò)實(shí)現(xiàn)視察者模式給用戶作為鉤子。對(duì)于在頁(yè)

面懇求時(shí)(模型存儲(chǔ),用戶登錄等)調(diào)用的特定動(dòng)作方法,Magent。會(huì)生成一個(gè)事務(wù)信號(hào)。

當(dāng)創(chuàng)建新的模塊時(shí),你可以“監(jiān)聽(tīng)”這些事務(wù)。比如說(shuō),你想在特定用戶登錄商店的時(shí)候發(fā)

一封郵件到管理員信箱里,可以逍過(guò)“監(jiān)聽(tīng)”customejlogin事務(wù)做到。

<events>

<customer_login>

<observers>

<unique_name>

<type>singleton</type>

<class>mymodule/observer</class>

<method>iSpyWithMyLittleEye</method>

</unique_name>

</observers>

</customer_login>

</events>

接下來(lái)是當(dāng)用戶登錄時(shí)應(yīng)當(dāng)運(yùn)行的代碼:

classPackagename_Mymodul

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論