版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 胃大部切除手术
- 中药直肠滴入治疗
- 个人林地承包合同协议书简单
- 肿瘤的中医护理
- 《电路原理skja》课件
- 统编版四年级上册语文第三单元 习作写观察日记 公开课一等奖创新教学设计
- 休克患者的病因及护理
- 2024年重症监护临床信息系统项目资金申请报告代可行性研究报告
- 2024年积木玩具投资项目资金申请报告
- 新建不锈钢净化灯项目立项申请报告
- 《铁道概论》考试复习题库400题(含答案)
- 末位淘汰制度
- DB15T 1700.1-2019“蒙字标”认证通用要求 农业生产加工领域
- 部编版八年级初二语文上册第六单元教材分析及全部教案(定稿;共7课)
- 妇产科学课件:子宫内膜异位症(英文版)
- 卧式单面多轴钻孔组合机床液压系统的设计
- 铁路线路工起道作业指导书
- 酒店安全生产规范要求
- 幼儿园:幼儿园食育课程的五个实施途径
- 人教版(2019)选择性必修第二册Unit3Food and Culture Reading Cultureand Cuisine课件(13张ppt)
- 2022年婚姻法与继承法案例分析题
评论
0/150
提交评论