`
coolsooner
  • 浏览: 1314784 次
文章分类
社区版块
存档分类
最新评论

深入理解Magento – 第一章 – Magento强大的配置系统

 
阅读更多

深入理解Magento – 第一章 – Magento强大的配置系统

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

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

设置插件的目录结构

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

大多数Magento的系统模块的结构和我们将要构建的插件的结构是一样的。Magento的系统模块在以下目录

app/code/core/Mage


每一个子目录都是一个单独的模块。这些模块是由Magento官方开发的。我们安装完Magento以后,所使用的功能就是来自这些模块。我们自己创建的模块应该放在如下目录

app/code/local/Packagename


“Packagename”
应该是一个唯一的字符串,用来标识你的代码。通常人们使用公司名字作为Packagename,比如

app/code/local/Microsoft


由于我在做我自己的Magento项目,我将使用我自己的项目名“App” 然后,我们要创建以下目录结构

app/code/local/App/Configviewer/Block

app/code/local/App/Configviewer/controllers

app/code/local/App/Configviewer/etc

app/code/local/App/Configviewer/Helper

app/code/local/App/Configviewer/Model

app/code/local/App/Configviewer/sql

你的插件并不一定需要包含以上所有的目录,但是为了以后开发方便,我们还是在一开始就把目录创建好。接下来我们要创建两个文件,一个是config.xml,放在etc目录下面

app/code/local/App/Configviewer/etc/config.xml

文件内容如下

<config>

<modules>

<App_Configviewer>

<version>0.1.0</version>

</App_Configviewer>

</modules>

</config>

第二个文件需要在如下位置创建

app/etc/modules/App_Configviewer.xml

第二个文件应该遵循如下命名规则“Packagename_Modulename.xml”,文件内容如下

<config>

<modules>

<App_Configviewer>

<active>true</active>

<codePool>local</codePool>

</App_Configviewer>

</modules>

</config>

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

<!--[if !supportLists]-->1. <!--[endif]-->清空Magento缓存

<!--[if !supportLists]-->2. <!--[endif]-->在后台管理界面,进入 System->Configuration->Advanced

<!--[if !supportLists]-->3. <!--[endif]-->展开“Disable Modules Output”

<!--[if !supportLists]-->4. <!--[endif]-->确认“App_Configviewer”显示出来了

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

创建模块逻辑

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

<?xml version="1.0" encoding="UTF-8"?>

<config>

<modules>

<App_Configviewer>

<version>0.1.0</version>

</App_Configviewer>

</modules>

<global>

<events>

<controller_front_init_routers>

<observers>

<app_configviewer_model_observer>

<type>singleton</type>

<class>App_Configviewer_Model_Observer</class>

<method>checkForConfigRequest</method>

</app_configviewer_model_observer>

</observers>

</controller_front_init_routers>

</events>

</global>

</config>

然后创建如下文件

App/Configviewer/Model/Observer.php

输入以下内容

<?php

class App_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

【注: 根据文中的配置,不难看出任何指向MagentoURL加了“?showConfig=true”以后,都会输出同样的内容,正常的执行流程会被终止。】

配置文件分析

打开上述URL,你应该看到一个巨大的XML文件。
<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:246pt; height:194.25pt' o:button="t"> <v:imagedata src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.png" mce_src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.png" o:href="http://www.wemvc.com/wp-content/uploads/2010/05/Screenshot.png" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
这个文件描述了当前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将通过以下逻辑来处理这行代码

<!--[if !supportLists]-->1. <!--[endif]-->在配置文件中查找标签

<!--[if !supportLists]-->2. <!--[endif]-->在里面查找标签

<!--[if !supportLists]-->3. <!--[endif]-->在里面查找标签

<!--[if !supportLists]-->4. <!--[endif]-->实例化从#3找到的类(Mage_SalesRule_Helper

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

分享到:
评论

相关推荐

    Magento-中文开发教程

    深入理解Magento-第一章 – Magento强大的配置系统 深入理解Magento-第二章 – Magento请求分发与控制器 深入理解Magento-第三章 – 布局,块和模板 深入理解Magento-第四章 – 模型和ORM基础 深入理解...

    Magento深入理解Magento

    深入理解Magento 由精东博客下载下来制作成pdf

    深入理解Magento.pdf

    经典名篇《深入理解magento》系列

    深入理解magento

    Magento 模块开发教程 请求分发与控制器 布局、块和模板 模型和ORM基础 高级Magento模型

    深入理解magento_V1.0.pdf

    深入理解magento_V1.0.pdf

    深入理解Magento详细培训教程

    十篇深入详细讲解magento的文章,对初学者来说是很好的资料,可以对magento有一个全面的了解,并理解magento的框架代码

    深入理解Magento-2.pdf

    本文档提供了创建和 Magento的应用程序进行安装定制的店面主题的说明。它描述 Magento的内容呈现过 程,并说明该系统的对有效地建立一个主题要求的范围内的观点层。该文件还走过日常前端开发人员的任务。

    深入学习Magento必读

    本文档通过一些实例详细讲述了Magento的MVC架构解析原理,通俗易懂,是有一定基础的Magento学习开发人员技能进阶的绝好文档。

    Magento系统请求响应流程图

    Magento系统请求响应流程图以及具体请求步骤分析,magento是一个强大的PHP开源框架

    深入理解Magento

    此文件是对Magento深入的了解,特别是对从事外贸方面的同事,对你的工作有很大的帮助、…………

    Magento模块开发教程.pdf

    Magento 的配置系统就像是 Magento 的心脏,支撑着 Magento 的运行。这套 配置系统掌管着几乎所有“module/model/class /template/etc”。它把整个 Magento 系统抽象出来,用一个配置文件来描述。这里的“配置文件”...

    开源网店系统 Magento

    这是国外一个开源的经典软件。另外上面附带了个人对这个开源的详细说明

    magento学习资料

    资源包里包含:Magento新闻模块开发教程,深入理解Magento,magento中文用户手册。希望对您有所帮助。

    magento数据结构分析

    magento数据结构分析 magento数据字典

    BUYSHOPMagento主题,兼容Magento 1.7.0.x ,自适应Retina 屏购物主题

    这个主题可以根据不同的需求进行不同的设置变更,4 个预定义的的布局,多种幻灯片,强大的管理面板,时尚的设计,列表多图展示! BUYSHOP Magento主题主要特点 常规功能 完全自适应100%. 你可以启用或关闭它 ...

    magento结构和原理

    magento结构和原理,能让你更好的理解magento

    magento 可开多个网店开源的电子商务系统

     Magento是一套专业开源的电子商务系统。  2.特点 Magento设计得非常灵活,具有模块化架构体系和丰富的功能。易于与第三方应用系统无缝集成。支持在一个后台上生成和管理多个网店甚至网站,多个网店和网站可共享...

    Magento-SMTP-Email

    magento的SMTP插件magento的SMTP插件magento的SMTP插件

    magik shoes magento 模板, magento 1.7 模板

    magik shoes magento 模板, magento 1.7 模板

Global site tag (gtag.js) - Google Analytics