Magento开发系列之二 配置文件

Coding Alan 9年前 (2015-08-06) 5063次浏览 0个评论 扫描二维码

config文件可以说是Magento的发动机,它从整体上包含了几乎一切模块、模型、类、模板文件等。很多PHP开发者不太适应这种高度的抽象,在开发中也给他们带来了不少的困扰和麻烦,但一旦掌握这种对系统文件的重载机制将带来空前的灵活性。

本节我们将创建一个用于在浏览器中查看系统配置的模块,请尝试跟着我们一起做,这样有助于你更进一步的了解Magento以及主要的名称和用法。

构建模块目录结构

这里我们会创建一个Magento模块,模块由一组php和xml文件组成,用于继承系统类添加新功能或重载系统方法。比如可以是为追踪销售信息添加新的数据模型、修改已有类的方法或添加全新的功能等等。

值得一提的是Magento系统中通常都是基于同一个模块,如果查看app/code/core/Mage的话,会发现里面包含很多的文件夹,这些都是由Magento团队所创建的模块,也正是默认情况下前台所用到的所有模块。

对于自建的模块通常会放在app/code/local/Packagename内,其中Packagename作为唯一标识你所开发代码的命名空间。作为一个不成文的规定,通常建议使用公司的名称,比如app/code/local/Google,在本系列的例子中我们将使用Alanhou,并使用Configviewer作为模块名称,所以首先请创建如下目录结构:

app/code/local/Alanhou/Configviewer/Block
app/code/local/Alanhou/Configviewer/controllers
app/code/local/Alanhou/Configviewer/etc
app/code/local/Alanhou/Configviewer/Helper
app/code/local/Alanhou/Configviewer/Model
app/code/local/Alanhou/Configviewer/sql

我们在本节的模块中不会用到所有这些文件夹,但创建这些文件夹有助于对整个模块结构的了解。下一步我们会创建两个文件

app/code/local/Alanhou/Configviewer/etc/config.xml
app/etc/modules/Alanhou_Configviewer.xml

第二个文件按照Packagename_Modulename.xml的规则来进行命名,在config.xml文件中放入如下代码:

<config>
    <modules>
        <Alanhou_Configviewer>
            <version>0.1.0</version>
        </Alanhou_Configviewer>
    </modules>
</config>

然后在Alanhou_Configviewer.xml中添加如下代码

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

如果你现在对上面的代码还是一头雾水的话,大可不必担心,后面会有详细的介绍。通过上面基本的框架已经搭建好了,执行以下步骤

  1. 清除缓存
  2. 在后台中,点击System > Configuration > Advanced > Advanced
  3. 在Disable modules output面板中查看Alanhou_Configviewer是否出现

如果看到Alanhou_Configviewer,那么恭喜你已经成功创建第一个模块。

Magento开发系列之二 配置文件

创建模块配置文件

你可能已经看到胜利的曙光了,不过截至目前这个模块还没有什么实质意义。这一模块我们计划完成的工作有

  1. 检查showConfig变量字段是否存在
  2. 如果showConfig存在,显示Magento的配置并中断其它的执行
  3. 检测是否存在其它的字符变量,showConfigFormat可以指定以纯文本或xml进行输出

首先我们将在config.xml文件中添加<global>代码块

<config>
	<modules>
		<Alanhou_Configviewer>
			<version>0.1.0</version>
		</Alanhou_Configviewer>
	</modules>
	<global>
		<events>
			<controller_front_init_routers>
				<observers>
					<Alanhou_configviewer_model_observer>
						<type>singleton</type>
						<class>Alanhou_Configviewer_Model_Observer</class>
						<method>checkForConfigRequest</method>
					</Alanhou_configviewer_model_observer>
				</observers>
			</controller_front_init_routers>
		</events>
	</global>
</config>

然后创建一个app/code/local/Alanhou/Configviewer/Model/Observer.php文件,加入如下代码:

<?php
    class Alanhou_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());
	}
    }

然后访问http://localhost/magento/?showConfig=true,就会出现像下面这样的一大串XML代码

Magento开发系列之二 配置文件

代码中主要包含Magento的状态,其中列出了所有的模块、模型、类、事件监听器等内容。

例如在如上的XML输出中搜索Alanhou_Configviewer_Model_Observer就可以找到对应的类。Magento中所有模块的config.xml文件都会被解析并包含到全局设置中。

那这些有什么实际意义呢,你现在看到这些内容可能会被吓到,但配置文件对于理解Magento来说相当之重要。你创建的所有模块都会被加到这个配置文件中,并且你在任何时候调用系统core中的功能时,都会到这个配置文件中去进行查看。

举个例子,熟悉MVC的开发者一定实例化过类似这样的helper类

$helper_sales = new HelperSales();

而Magento对于PHP的类声明进行了抽象化,所以上面的代码在Magento中会像这样

$helper_sales = Mage::helper('sales');

用通俗的话来讲,这个静态helper方法会完成如下动作

  1. 在Config中查找<helpers />代码段
  2. 在<helpers />代码段中查找<sales />代码段
  3. 在<sales />代码段中查找<class />代码段
  4. 将斜杠后的内容添加到上一步所查找到的内容后(本例采用默认值data)
  5. 实例化上一步中所查找到的类,即Mage_Sales_Helper_Data

看上去这样有些繁杂,但通过在配置文件中查找类,有助于我们在不修改core代码的情况下重载Magento的系统方法。而且相当的灵活,可以对部分系统方法进行继承修改。

喜欢 (1)
[]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址