Magento中文開發手冊開篇_第1頁
Magento中文開發手冊開篇_第2頁
Magento中文開發手冊開篇_第3頁
Magento中文開發手冊開篇_第4頁
Magento中文開發手冊開篇_第5頁
已閱讀5頁,還剩8頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Magent。(麥進斗)是這個星球上最強大的購物車網店平臺。當然,你應當已經對此亳無疑問

To不過,你可能還不知道,Magento(麥進斗)同樣是一個面對對象的PHP框架。你可以

辦作Magento(麥進斗)購物車程序強大的功能,開發動態WEB應用程序。

采納高端Magento(麥進斗)電子商務系統可訂制對接企業ERP、CRM如:SAPNAVSalesforce

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

等電子商務銷售平臺,Magento(麥進斗)還可訂制對接開發微信商城、移動電商APP。

相較于老的ecshop構架,Magento(麥進斗)作為全球第一電商平臺可供應完整核心源代碼的

電商解決方案,適合品牌企業、跨國企業、跨境電商企業。麥進斗科技供應上訴完整電商解

決方案,歡迎詢問聯系麥進斗

這是Magento中文開發手冊的開篇,我們會在整個手冊中介紹絕大部分Magento的開發框

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

中鶴立雞群了。

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

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

配置型MVC架構

Magento限制器(MagentoControllers)

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

Magento模型(MagentoModels)

Magento助手(MagentoHelpers)

Magento布局(MagentoLayouts)

事務監聽(Observers)

Magento類重寫(ClassOverrides)

總結

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

Magento模塊中的代碼組織形式

Magento通過將代碼放入獨立的模塊進行組織。在一個典型的PHPMVC應用中,全部的限

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

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

Magento的代碼:

舉例來說,假如你想找尋Magento中關于付款的功能,你僅僅須要找到下面代碼中的文件

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

app/code/core/Mage/Checkout

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

獲得全部你想要的信息。

app/code/core/Mage/GoogleCheckout

你的代碼:

假如你想擴展Magento,千萬不要想當然的去修改core文件夾中的文件,也不要將你自己

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

local文件夾中進行。

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

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

過Package來標識你的公司,組織或個人。通過Package,世界范圍內的Magento社區在創

建模塊擴展時,能夠運用他們自己的Package名稱,以避開及其他開發者有命名沖突。

創建一個新的模塊時,你須要告知Magent。新模塊的相關信息。可以通過添加一個XML文

件在下面的書目中。

app/etc/modules

在這個書目中有兩類xml文件,第一種用來開啟獨立的模塊,以下列方式命名:

Packagename_Modulename.xml

其次種文件用來從一個Package中開啟多個模塊,以下列方式命名:

Packagename_All.xml

配置型MVC系統

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

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

在約定型MVC系統中,假如你添加一個限制器,或者一個模型,只須要依據約定的內容,

創建這個文件以及類即可,系統會自動識別它。

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

的告知系統該類的存在。在Magento中,每個模塊都有一個config.xml文件。這個文件中包

含了一個模塊相關的配置信息。在運行時,全部模塊的配置文件,都會被加載到一個巨大的

配置文件樹中(后面的文章會介紹如何查看這個配置樹)。

比如,想在模塊中運用模型。你須要添加類似下面的代碼,來告知Magento你會在這個模

塊中運用這個模型。

<models>

〈packagename〉

<class>Packagename_Modulename_Model</class>

</packagename>

<models>

當然,這種配置不僅限于模型,對于限制器,助手,Blocks,路由,事務句柄等都須要在該

模塊的config.xml中進行相關的配置。

Magento限制器(MagentoControllers)

在任何PHP系統當中,核心文件確定是PHP文件。Magento也不例外,index.php是Magento

的核心文件。

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

下幾項:

檢測URL地址。

依據路由規則,將訪問的URL地址分發到限制器類中的方法。

初始化限制器,并調用相應的動作方法。這一步驟叫做分發。Dispatchingo

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

方法。一起來看下面這個URL:

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

FrontName-catalog

該URL的第一部分被稱為FrontName.它用來指示Magento應當在哪個模塊中找尋URL中

的限制器。在這個例子中,catalog就是FrontName,對應于catalog模塊。

ControllerName-Category

其次部分指示Magento應當匹配的限制器。每個擁有限制器的模塊都包含一個‘controllers'

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

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

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

classMage_Catalog_CategoryControllerextendsMage_Core_Controller_Front_Action

)

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

ActionName-view

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

classMage_Catalog_CategoryControllerextendsMage_Core_Controller_Front_Action{

publicfunctionviewAction(){

)

}

Paramater/Value-id/25

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

我們的例子當中,'id啟5'表示有一個值為25的$_6£丁[我,]變量。

如前所述,假如你想讓自定義模塊運用限制器,你必需對它進行配置。下面是在模塊中開啟

限制器的代碼。

<frontend>

<routers>

<catalog>

<use>standard</use>

<args>

<module>Mage_Catalog</module>

<frontName>catalog</frontName>

</args>

</catalog>

</routers>

</frontend>

現在不清晰上述內容都是什么意思還沒關系,但是留意<frontName>catalog</frontName>。

這是用來關聯模塊及URL地址中frontname的。Magento核心代碼選擇將一個模塊的名字及

frontname一樣,但這不是強制規定的。

MultipleRouters

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

在URL中無法匹配到正確的限制罌/動作,它會嘗試運用針對Admin程序(后臺管理端)的

另?套路由規則。假如照舊無法正確匹配,它會運用?個特別的限制器

Mage_Cms_lndexControllero

CMS限制器會檢查Magento內容管理系統中是否有內容須要輸出,假如有內容輸出,則讀

取該內容,假如找不到,則輸出44頁面。

例如,Magento默認的首頁就是在運用CMS限制器。

Context-BasedURI模型讀取

目前為止,我們已經建立了一個限制器以及一個方法,到實例化一個類做點什么的時候了。

Magento供應了一種特別的方式去實例化模型,助手以及Blocks,即運用Mage全局類供應

的靜態工廠方法。例如,

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

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

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

的第一部分用來指示該類存在于哪個模塊當中。其次部分用來確定哪個類將被調用。

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

類名將以MagjCatalog開頭,然后依據調用的類型,將product類名加入到最終一部分。即,

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

Mage_Catalog_Model_Product;

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

Mage_Catalog_Helper_Product;

Magento模型

和現在的多數框架一樣,Magento也供應ORM支持。ORM讓你能夠專注于數據,而非無盡

的SQL語句。例如,

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

$price=$model->getPrice();

$price+=5;

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

$model->save();

在上面這個例子中,我們調用了“getPrice”和“setPrice”方法。然而,在

Mage_Catalog_Model_Product類中并沒有此方法。那為什么上面這個例子能夠運用這些方法

呢?因為Magento的ORM系統中運用了PHP的_get和_set魔術方法。

調用$product->getPrice()會獲得模型屬性price,而調用$product->setPrice()會設置price屬性。

當然,全部的這些都假設模型類沒有getPrice和setPrice方法。假如它們存在于模型類中,

PHP魔術方法會被忽視。假如你有愛好知道這是如何實現的,可以參考Varien_Object類,

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

假如你想獲得模型當中全部的數據,可以干脆調用$pr。duct?>getData。方法,它會返回包含

全部字段的一個數組。

你可能已經留意到上例中的方法存在運用。符號鏈接的形式:

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

能夠運用這種方式調用方法,最主要的緣由是全部的set方法都會返回一個模型的實例。你

會常常在Magento的核心代碼中看到此類調用方法的形式。

Magento的ORM系統中還包含一種通過Collections接口查詢多個對象的方式。下例會讀取

系統中全部5美元的產品。

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

->getCollection()

->addAttributeToSelect('*')

^addFieldToFilterfprice'/S.OO');

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

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

foreach($products_collectionas$product)

echo$product->getName{);

}

在上面的個例了當中,你可能留意到了addAttributeToSelect方法。這里單獨提到此方法,

是因為它代表了Magento模型中的一個類別。Magento擁有兩種形式的模型對象。一種是

傳統的“一個對象,一張表”的ActiveRecord模型。當你實例化這些模型的時候,全部的屬

性都會被自動選取。

Magento中其次種模型叫做EntityAttributeValue(EAV)模型。這種模型會依據確定的規律

將數據分散存儲在數據庫不同的表中。EAV模型的高級特性,讓Magent。不用在增加一種產

品屬性的時候變更數據庫模型(一般的購物車系統在增加新的屬性時,有兩種方式,一種是

增加數據庫字段,一種是運用預留的空字段。),從而保證了Magento系統的高度擴展性。

當創建一個EAV模型的collection時,Magento會conservativein它會查詢的字段數,全部你

可以運用addAttributeToSelect來制定你想獲得的列,或者運用addAttrbuteToSelect(*)來獲得

全部列。

MagentoHelpers助手

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

作。例如,

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

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

手類。下面的語句及上面的作用是相同的,即默認運用模塊下的data助手類。

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

大部分的助手類繼承自Mage_Core_Helper_Abstract,默認供應了很多運用的方法。

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

if($helper->isModuleOutputEnabled()){

}

MagentoLayout布局

目前為止,我們已經介紹了限制器,模型以及助手。在典型的PHPMVC系統當中,在操作

模型之后,一般會

傳遞變量到視圖中。

系統會自動讀取默認的外層布局

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

不過,假如你細致視察Magent。限制器動作方法,你不會看到這些步驟,

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形式的是,限制器動作方法,以兩個輸出布局的方法結束。所以說,

MagentoMVC系統中的V視圖部分可能及你常常運用的大相徑庭,因為,你必需在限制器

中明確的輸出布局。

并且,Magento的布局本身也區分及你常常運用的MVC系統。Magento布局是一個包含嵌

套或者樹狀的Block對象的對象。每一個Block對象輸出一部分HTML,輸出HTML的環節包

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

Blocks對象負責及Magento系統交互并從模型中獲得數據,而phtml模板文件則為頁面生成

必需的HTML代碼。

例如,頁面頭部Block文件app/code/core/Mage/Page/Block/Html/Head.php運用及其對應的

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

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

默認的,當你調用,

1

2

$this->loadLayout();

$this->renderLayout();

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

譯,也許意思是Magento會讀取網站的布局框架)。這些結構Blocks用來輸出head,body

以及設定單欄或多欄的布局。另外,還有一些內容Blocks負責實際輸出像導航,產品分類

等。

“結構”和“內容”Blocks在布局系統中是隨意設置的。一般不會在代碼中刻意添加代碼,

從而區分一個Block是結構還是內容,但是Blocks要么屬于“結構”,要么屬于“內容”。

為了添加一個內容Blocks到布局中,你須要告知Magento系統

“Magento,快把這幾個Blocks添加到內容Block里”

或者

aMagento,把這邊兒個Blocks放到“左邊欄”結構Block里”

這些可以通過限制器中的代碼進行限制,

publicfunctionindexAction(){

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

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

}

但是更常用的方式(至少在前臺購物車應用中)是運用基于XML文件的布局系統。

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

區域(即StructureBlocks)。例如下面這個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限制器的默認動作方法中,將

catalog/navigationBlock插入到左邊欄結構Block中,并運用catalog/navigation/left.phtml模

板文件。

關于Blocks還有一個比較重要的特性。在模板文件中,你會看到很多類似下面的代碼,

1

$this->getChildHtml('orderJtems')

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

另一個子Block時,才能在模板文件中通過gctChildHtml。方法調用子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中,我們才可以調用$m$->8?1:0|同1411('foobar');

Observers視察者

和很多優秀的面對對象系統一樣,Magento通過實現視察者模式給用戶作為鉤子。對于在頁

面懇求時(模型存儲,用戶登錄等)調用的特定動作方法,Magent。會生成一個事務信號。

當創建新的模塊時,你可以“監聽”這些事務。比如說,你想在特定用戶登錄商店的時候發

一封郵件到管理員信箱里,可以逍過“監聽”customejlogin事務做到。

<events>

<customer_login>

<observers>

<unique_name>

<type>singleton</type>

<class>mymodule/observer</class>

<method>iSpyWithMyLittleEye</method>

</unique_name>

</observers>

</customer_login>

</events>

接下來是當用戶登錄時應當運行的代碼:

classPackagename_Mymodul

溫馨提示

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

評論

0/150

提交評論