前往顾页
以后地位: 主页 > 收集编程 > Php实例教程 >

深切了解Magento的建设体系

时候:2015-02-27 21:19来源:知行网www.zhixing123.cn 编辑:麦田守望者

第一章 - 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”应当是一个独一的字符串" title="字符串">字符串,用来标识你的代码。凡是人们利用公司名字作为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确切装载了你的模块
清空Magento缓存
在背景办理界面,进入 System->Configuration->Advanced
展开“Disable Modules Output”
确认“Alanstormdotcom_Configviewer”显现出来了
如果你看到“Alanstormdotcom_Configviewer”,那么祝贺你,你已成功建立了你第一个Magento模块!
建立模块逻辑

我们之前建立的模块不会做任何事情,下面我们来为这个模块插手逻辑
1. 查抄“showConfig”查询字符串" title="字符串">字符串是不是存在
2. 如果“showConfig”存在,那么查抄“showConfigFormat”查询字符串" title="字符串">字符串是不是存在
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" title="format">format = isset($this->request->{self::FLAG_SHOW_CONFIG_FORMAT}) ?
$this->request->{self::FLAG_SHOW_CONFIG_FORMAT} : 'xml';
switch($format" title="format">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://sjolzy.cn/?showConfig=true
【译者注: 按照文中的建设,不丢脸出任何指向Magento的URL加了“?showConfig=true”今后,都会输入一样的内容,一般的履行流程会被停止。】
建设文件阐发

翻开上述URL,你应当看到一个巨年夜的XML文件。这个文件描述了以后Magento体系的状况。它列出了所有的模块,数据模型,类,事件,监听器等等。举个例子,如果你搜刮以下字符串" title="字符串">字符串
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将经由过程以下逻辑来措置这行代码
在建设文件中查找<helpers />标签
在<helpers />内里查找 <salesrule />标签
在<sales />内里查找 <class />标签
实例化从#3找到的类(Mage_SalesRule_Helper)
Magento老是经由过程建设文件来获得类名,这个逻辑看起来有些复杂,但如许做的长处也很较着,我们可以不需求变动Magento的代码就可以变动Magento的核心服从。【译者注: 在这个例子中,我们可以经由过程点窜建设文件用我们本身的SalesRule_Helper类来替代本来阿谁】这类高度笼统的编程体例在php中其实不常见,但是它可让你清楚的扩展或替代体系的某一部分。
 

------分开线----------------------------
标签(Tag):Magento
------分开线----------------------------
保举内容
猜你感兴趣