当前位置: 首页 > news >正文

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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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
文件内容如下

[xhtml] view plain copy

  1. <config>      
  2.     <modules>  
  3.         <Alanstormdotcom_Configviewer>  
  4.             <version>0.1.0</version>  
  5.         </Alanstormdotcom_Configviewer>  
  6.     </modules>  
  7. </config>  

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

[xhtml] view plain copy

  1. <config>  
  2.     <modules>  
  3.         <Alanstormdotcom_Configviewer>  
  4.             <active>true</active>  
  5.             <codePool>local</codePool>  
  6.         </Alanstormdotcom_Configviewer>  
  7.     </modules>  
  8. </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文件

[xhtml] view plain copy

  1. <config>  
  2.     <modules>...</modules>  
  3.     <global>  
  4.         <events>  
  5.             <controller_front_init_routers>  
  6.                 <observers>  
  7.                     <alanstormdotcom_configviewer_model_observer>  
  8.                         <type>singleton</type>                            
  9.                         <class>Alanstormdotcom_Configviewer_Model_Observer</class>  
  10.                         <method>checkForConfigRequest</method>  
  11.                     </alanstormdotcom_configviewer_model_observer>  
  12.                 </observers>  
  13.             </controller_front_init_routers>  
  14.         </events>  
  15.     </global>  
  16. </config>  

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

[php] view plain copy

  1. <?php  
  2.     class Alanstormdotcom_Configviewer_Model_Observer {  
  3.         const FLAG_SHOW_CONFIG = 'showConfig';  
  4.         const FLAG_SHOW_CONFIG_FORMAT = 'showConfigFormat';       
  5.         private $request;  
  6.         public function checkForConfigRequest($observer) {            
  7.             $this->request = $observer->getEvent()->getData('front')->getRequest();  
  8.             if($this->request->{self::FLAG_SHOW_CONFIG} === 'true'){  
  9.                 $this->setHeader();  
  10.                 $this->outputConfig();  
  11.             }  
  12.         }  
  13.         private function setHeader() {  
  14.             $format = isset($this->request->{self::FLAG_SHOW_CONFIG_FORMAT}) ?   
  15.             $this->request->{self::FLAG_SHOW_CONFIG_FORMAT} : 'xml';                                  
  16.             switch($format){  
  17.                 case 'text':  
  18.                     header("Content-Type: text/plain");  
  19.                     break;  
  20.                 default:  
  21.                     header("Content-Type: text/xml");  
  22.             }             
  23.         }  
  24.         private function outputConfig() {              
  25.             die(Mage::app()->getConfig()->getNode()->asXML());        
  26.         }  
  27.     }  
  28. ?>  

好了,代码编辑结束。清空你的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中并不常见,但是它可以让你清晰的扩展或者替换系统的某一部分。

转载于:https://my.oschina.net/ganfanghua/blog/918361

相关文章:

  • Directx9.0 学习教程3 -图形学之创建点 线 三角形 等
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • maven管理项目用junit测试遇到的找不到编译类问题
  • 2017中国手机趋势报告:天猫手机客单价2104元,品质时代来临
  • docker 在Windows下使用遇到的坑
  • CSS鼠标属性值
  • django-1.11.3 源码详解 -- 0001 django-admin.py 的调用逻辑
  • JMeter中返回Json数据的处理方法
  • getopts命令行参数处理
  • SparkSQL架构
  • 两个fragment之间简单的跳转
  • Spring《六》管理Bean
  • Python开发【第四篇】:Python基础之函数
  • 【cocos2d-x 3.7 飞机大战】 决战南海I (四) 敌机管理
  • 先来认识一些UML图标
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • CSS中外联样式表代表的含义
  • Debian下无root权限使用Python访问Oracle
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • JavaScript实现分页效果
  • Mysql优化
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Python_OOP
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 分享几个不错的工具
  • 区块链共识机制优缺点对比都是什么
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 入门级的git使用指北
  • 试着探索高并发下的系统架构面貌
  • 通信类
  • 小李飞刀:SQL题目刷起来!
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 阿里云移动端播放器高级功能介绍
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 交换综合实验一
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • # 达梦数据库知识点
  • #android不同版本废弃api,新api。
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (03)光刻——半导体电路的绘制
  • (1)SpringCloud 整合Python
  • (11)MATLAB PCA+SVM 人脸识别
  • (175)FPGA门控时钟技术
  • (4) PIVOT 和 UPIVOT 的使用
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (剑指Offer)面试题34:丑数
  • (七)理解angular中的module和injector,即依赖注入
  • (正则)提取页面里的img标签
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...