magento开发 -- 深入理解Magento

 

作者:Alan Storm
翻译:zhlmmc

前言

我从2007年开始使用Magento,应该算是国内第一批使用Magento的用户。但是我却从来没有认真研究过Magento,更多的停留在应用层面。虽然也做过一些插件,但也就是依葫芦画瓢而已。偶然间看到Alan Storm的一系列关于Magento的文章,我忍不住的心潮澎湃,相见恨晚。Alan的文章循序渐进,深入浅出地讲述了Magento的架构和工作方式, 把一个复杂系统的内部结构淋漓尽致的展现在我们面前。读完以后,我茅塞顿开,感叹Magento的强大,架构之美。于是我决定翻译Alan的文章,希望对更多的Magento开发者有所帮助。

Alan的文章不是Magento入门教程,并不是教你如何安装,使用Magento。借用 Alan的原话“Magento Articles for Professional Developers”,我认为这里的“Professional”包含以下几点:

  1. 懂得PHP的运作方式
  2. 良好的编程基础 (写过5w行代码以上)
  3. 了解基本设计模式
  4. 安装并使用过Magento
  5. 阅读并修改过Magento代码

我的翻译加入了我自己的理解,对原文有所修改和调整。还有,Alan的文章写的比较早,现在Magento出新版了,所以我对文中的代码进行了修改,我翻译以后的文章是基于Magento 1.4.0.1版本的。所以如果你发现我的翻译和原文有不符的地方,请不要见怪。下面让我们开始奇妙的Magento之旅!

第一章 - Magento强大的配置系统

Magento的配置系统就像是Magento的心脏,支撑着Magento的运行。这套配置系统掌管着几乎所有“module/model/class/template/etc”。它把整个Magento系统抽象出来,用一个配置文件来描述。这里的“配置文件”并不是一个物理上存在的文件,而是Magento根据当前的系统状态动态生成的一段XML。大多数的PHP开发者并不习惯于这样抽象层,因为它增加的编程的复杂性。但是这样的抽象提供了无与伦比的灵活性,允许你覆盖几乎任何系统的默认行为。

首先,让我们写一个简单的插件来看看这个所谓的“配置文件”长什么样。虽然我已经提供的现成的代码,但是还是建议你自己建立这个插件,把整个流程走一遍有助于你的理解。

 

设置插件的目录结构

 

我们将要创建一个Magento的模块【译者注: Magento的插件不叫plug-in,叫module,翻译成模块】。Magento的模块由php和xml文件组成,目的是扩展或者覆盖系统的行为,比如为订单增加数据模型,更改一个类的方法,或者增加一个全新的功能。【译者注:Magento自带的那些功能也都是基于模块的,比如用户注册,商品展示,结账流程等等。Magento给我的感觉就是一切皆模块,和Eclipse的插件体系结构有点像】

大多数Magento的系统模块的结构和我们将要构建的插件的结构是一样的。Magento的系统模块在以下目录
app/code/core/Mage
每一个子目录都是一个单独的模块。这些模块是由Magento官方开发的。我们安装完Magento以后,所使用的功能就是来自这些模块。我们自己创建的模块应该放在如下目录
app/code/local/Packagename
“Packagename”应该是一个唯一的字符串,用来标识你的代码。通常人们使用公司名字作为Packagename,比如
app/code/local/Microsoft
由于我在做我自己的Magento项目,我将使用我自己的域名“Alanstormdotcom”。 然后,我们要创建以下目录结构
app/code/local/Alanstormdotcom/Configviewer/Block
app/code/local/Alanstormdotcom/Configviewer/controllers
app/code/local/Alanstormdotcom/Configviewer/etc
app/code/local/Alanstormdotcom/Configviewer/Helper
app/code/local/Alanstormdotcom/Configviewer/Model
app/code/local/Alanstormdotcom/Configviewer/sql
你的插件并不一定需要包含以上所有的目录,但是为了以后开发方便,我们还是在一开始就把目录创建好。接下来我们要创建两个文件,一个是config.xml,放在etc目录下面
app/code/local/Alanstormdotcom/Configviewer/etc/config.xml
文件内容如下

<config>
<modules>
<Alanstormdotcom_Configviewer>
<version>0.1.0</version>
</Alanstormdotcom_Configviewer>
</modules>
</config> 

 

第二个文件需要在如下位置创建
app/etc/modules/Alanstormdotcom_Configviewer.xml
第二个文件应该遵循如下命名规则“Packagename_Modulename.xml”,文件内容如下

 

<config>
<modules>
<Alanstormdotcom_Configviewer>
<active>true</active>
<codePool>local</codePool>
</Alanstormdotcom_Configviewer>
</modules>
</config> 

 

我们先不管这些文件是干什么的,以后会解释。建立好这两个文件以后,你的模块的骨架就已经完成了。Magento已经知道你的模块存在,但是现在你的模块不会做任何事情。我们来确认一下Magento确实装载了你的模块

  1. 清空Magento缓存
  2. 在后台管理界面,进入 System->Configuration->Advanced
  3. 展开“Disable Modules Output”
  4. 确认“Alanstormdotcom_Configviewer”显示出来了

如果你看到“Alanstormdotcom_Configviewer”,那么恭喜你,你已经成功创建了你第一个Magento模块!

 

创建模块逻辑

 

我们之前创建的模块不会做任何事情,下面我们来为这个模块加入逻辑
1. 检查“showConfig”查询字符串是否存在
2. 如果“showConfig”存在,那么检查“showConfigFormat”查询字符串是否存在
3. 如果“showConfigFormat”存在,那么输出指定格式的配置信息,否则输出默认格式的配置信息
4. 终止执行流程
首先更改我们的config.xml文件

 

<config>
<modules>...</modules>
<global>
<events>
<controller_front_init_routers>
<observers>
<alanstormdotcom_configviewer_model_observer>
<type>singleton</type>
<class>Alanstormdotcom_Configviewer_Model_Observer</class>
<method>checkForConfigRequest</method>
</alanstormdotcom_configviewer_model_observer>
</observers>
</controller_front_init_routers>
</events>
</global>
</config> 

 

然后创建如下文件
Alanstormdotcom/Configviewer/Model/Observer.php
输入以下内容

 

<?php
class Alanstormdotcom_Configviewer_Model_Observer {
const FLAG_SHOW_CONFIG = 'showConfig';
const FLAG_SHOW_CONFIG_FORMAT = 'showConfigFormat';
private $request;
public function checkForConfigRequest($observer) {
$this->request = $observer->getEvent()->getData('front')->getRequest();
if($this->request->{self::FLAG_SHOW_CONFIG} === 'true'){
$this->setHeader();
$this->outputConfig();
}
}
private function setHeader() {
$format = isset($this->request->{self::FLAG_SHOW_CONFIG_FORMAT}) ?
$this->request->{self::FLAG_SHOW_CONFIG_FORMAT} : 'xml';
switch($format){
case 'text':
header("Content-Type: text/plain");
break;
default:
header("Content-Type: text/xml");
}
}
private function outputConfig() {
die(Mage::app()->getConfig()->getNode()->asXML());
}
}
?> 

 

好了,代码编辑结束。清空你的Magento缓存,输入如下URL
http://magento.example.com/?showConfig=true
【译者注: 根据文中的配置,不难看出任何指向Magento的URL加了“?showConfig=true”以后,都会输出同样的内容,正常的执行流程会被终止。】

 

配置文件分析

打开上述URL,你应该看到一个巨大的XML文件。这个文件描述了当前Magento系统的状态。它列出了所有的模块,数据模型,类,事件,监听器等等。举个例子,如果你搜索如下字符串
Configviewer_Model_Observer
你会发现刚刚你创建的那个类被列出来了。Magento会解析每个模块的config.xml,并把它们包含在这个全局配置中。

 

这个配置文件有啥用?

到目前为止,我们所作的事情似乎没什么意义,但是这个配置文件却是理解Magento的关键因素。你创建的每一个模块都会被加到这个配置文件中,任何时候,你需要调用一个系统功能的时候,Magento都会通过这个配置文件来查询相应的模块和功能。举个简单的例子,如果你懂MVC的话,你应该和“helper class”之类概念的打过交道
$helper_salesrule = new Mage_SalesRule_Helper();
Magento抽象了PHP的类声明方式。在Magento系统中,上面的代码等同于
$helper_salesrule = Mage::helper('salesrule');
Magento将通过以下逻辑来处理这行代码

  1. 在配置文件中查找<helpers />标签
  2. 在<helpers />里面查找 <salesrule />标签
  3. 在<sales />里面查找 <class />标签
  4. 实例化从#3找到的类(Mage_SalesRule_Helper)

Magento总是通过配置文件来获得类名,这个逻辑看起来有些复杂,但这样做的优点也很明显,我们可以不需要更改Magento的代码就能更改Magento的核心功能。【译者注: 在这个例子中,我们可以通过修改配置文件用我们自己的SalesRule_Helper类来替换原来那个】这种高度抽象的编程方式在php中并不常见,但是它可以让你清晰的扩展或者替换系统的某一部分。

 

源文:http://www.oschina.net/bbs/thread/7937?lp=1

时间: 2024-08-03 15:28:15

magento开发 -- 深入理解Magento的相关文章

magento 开发 -- 深入理解Magento第六章 – 高级Magento模型

  第六章 – 高级Magento模型 我们讲过Magento有两种模型,简单模型和EAV(Entity Attribute Value)模型.上一章我们讲过所有的Magento模型都是继承自Mage_Core_Model_Abstract / Varien_Object.简单模型和EAV模型的区别在于资源模型(Model Resource).虽然所有的资源模型都最终继承"Mage_Core_Model_Resrouce_Abstract",但是简单模型是直接继承"Mage_

magento 开发 -- 深入理解Magento第七章 – 自定义Magento系统配置

  第七章 – 自定义Magento系统配置 Magento拥有十分强大的后台管理系统.作为一名开发人员,这套后台管理系统可以让你的用户简单直接的配置Magento系统或者你创建的模块.和Magento的其他功能一样,你第一次使用这套管理系统的时候可能觉得很麻烦,但是一旦你上手了,你会发现它强大的功能是那么吸引人.那么让我们开始吧.我们这一章的例子依然是基于Helloworld模块. 添加系统配置文件 首先我们要为模块添加一个系统配置文件.这个文件和"config.xml"是不搭界的a

magento 开发 -- 深入理解Magento第五章 – Magento资源配置

  第五章 – Magento资源配置 对于任何一个更新频繁的项目来说,保持开发环境和生产环境的数据库同步是件很头疼的事情.Magento提供了一套系统,用版本化的资源迁移脚本来解决这个问题. 上一章,我们为 Helloworld Blogpost 创建了一个模型.我们直接通过SQL语句"CREATE TABLE"来创建数据表.在这一章,我们将为Helloworld模块创建一个资源配置(Setup Resource)用于创建数据表.我们也会创建一个模块升级脚本,用来升级已经安装的模块.

magento 开发 -- 深入理解Magento第四章 – 模型和ORM基础

第四章 – 模型和ORM基础 对于任何一个MVC架构,模型(Model)层的实现都是占据了很大一部分.对于Magento来说,模型占据了一个更加重要的位置,因为它常常包含了一部分商业逻辑代码(可以说它对,也可以说它错).这些代码在其他的MVC框架中往往出现在控制器或者帮助函数中. 传统的PHP MVC架构中的模型 本来MVC的定义就不是很清晰,不同的人有不同的看法,而对于模型的定义争议就更多了.在MVC模式被广泛采用之前,PHP程序员往往通过SQL语句直接操作数据库.也有些程序员通过一个SQL抽

magento开发 -- 深入理解Magento第二章

  第二章 - Magento请求分发与控制器 Model-View-Controller (MVC) ,模型-视图-控制器,源于Smalltalk编程语言和Xerox Parc.现在有很多系统是基于MVC架构的,不同的系统MVC的实现也略有不同,但都体现了MVC的精髓,分离数据,业务逻辑和显示逻辑.最常见的PHP MVC框架是这样的 URL请求被一个PHP文件拦截,通常称为前端控制器(Front Controller) 这个PHP文件分析这个URL,获得一个执行控制器(Action Contr

计划翻译Magento开发手册

计划翻译Magento开发手册,希望在我遇到困难的时候能得到大家的帮助,也希望各位对翻译中的不妥之处提出意见,谢谢.手册简介Introduction     对一个开发人员来说,电子商务开发也许是现今最具创造性的工作.在这个瞬息万变的网络世界,为了保持始终领先竞争对手一步,无论是对你自己还是你的客户,你都需要更具创造性的解决方案.只有最棒的用户体验才能把你的潜在客户真正转化为营业额.有组织的布局,方便的搜索,快速的页面载入,吸引人的显示效果,直观的导航合在一起形成了用户体验,它能在商店和消费者之

magento -- 开发必备插件一

  名称:    Developer Toolbar for Magento Extension Key:magento-community/HM_DeveloperToolbar 网址:    http://www.magentocommerce.com/module/2271/developer-toolbar 介绍:    在前台页面底部生成一条工具栏,可一键开启和关闭前后台模板提示,开启和关闭在线翻译,清空缓存等等,可谓magento开发头号利器.Enjoy It!

Magento开发手册中文版第一章

手册简介Introduction 对一个开发人员来说,电子商务开发也许是现今最具创造性的工作.在这个瞬息万变的网络世界,为了保持始终领先竞争对手一步,无论是对你自己还是你的客户,你都需要更具创造性的解决方案.只有最棒的用户体验才能把你的潜在客户真正转化为营业额.有组织的布局,方便的搜索,快速的页面载入,吸引人的显示效果,直观的导航合在一起形成了用户体验,它能在商店和消费者之间建立起一定程度的信任感. 用最好的工具来开始一个电子商务解决方案为您实现客户的各种想法打下了坚实的基础. 以magento

magento 开发 -- 新增一个简单的退货流程

       在现有的Magento系统中,客户在前台并没有一个可以申请退货的地方,退货操作只能由商家一方在后台操作.应客户需求,我为系统新增了一个前台客户可以申请退货的功能,并新增一个订单状态来保存客户申请之后的订单状态,下面简单描述下流程.        1.新增一个订单状态         Magento的订单状态是由配置文件中配置的,打开config.xml文件,在global标签中新增如下代码   <sales> <order> <statuses> <