跨境电商
经验交流分享

Magento开发文档(二):Magento配置

magento

Magento中文手册(二):Magento配置

Magento 的配置文件如同该系统的心脏一般。它负责从总体上配置所有被请求的模块,模型,类,模板文件等。它是绝大部分PHP程序员不会接触到的一块抽象层,同时也 会增加一系列的开发成本,但是,所有这些都是值得的,因为Magento的配置文件允许你对系统的默认功能进行你无法想象的高度扩展。

为了学习Magento配置文件,我们将会在本章创建一个Magento模块,使其能够在浏览器中访问并显示Magento系统的配置文件。

本篇文章中包括的内容有,

  • 设置一个Magento模块的目录结构
  • 创建模块的配置文件
  • 我能在配置文件中找到什么有用信息?
  • 为什么配置文件对我如此重要?

设置Magento模块的目录结构

这一节我们将创建一个Magento模块。Magento模块是由PHP及XML文件组成,用来给系统扩展新的功能,或重写、扩展核心系统的行为。这可能意味着添加新的数据模型来跟踪销售信息,改变系统中类的行为,或添加完全新的功能。

Magento系统中绝大多数你将使用到的模块都具有相同的结构。如果你查看,

app/code/core/Mage

该目录下的每个文件夹都是Magento团队创建的一个单独的模块。同时,你创建的模块将会放在以下文件夹中,

app/code/local/Packagename

“Packagename” 应该是能够区别你代码的唯一命名。一般情况下是可以是你的公司名称,但你也可以随意命名。例如,微软公司开发的Magento模块,可能会使用以下命名,

app/code/local/Microsoft

在这里,我们使用”Magentotutorial”。那么首先,要创建模块,我们需要创建如下所示的目录结构,

app/code/local/Magentotutorial/Configviewer/Block

app/code/local/Magentotutorial/Configviewer/controllers

app/code/local/Magentotutorial/Configviewer/etc

app/code/local/Magentotutorial/Configviewer/Helper

app/code/local/Magentotutorial/Configviewer/Model

app/code/local/Magentotutorial/Configviewer/sql

一个模块并不一定需要上述所有的目录,但是先把他们给全部创建好是个不错的注意。接着,需要创建两个配置文件,一个是位于上述路径etc目录中的config.xml ,

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

第二个位于下面的路径,

app/etc/modules/Magentotutorial_configviewer.xml

config.xml文件中会包含下面的代码,先不用理解这些代表什么,继续看,下面会细细讲解。

[xml]
<config>
<modules>
<Magentotutorial_Configviewer>
<version>0.1.0</version>
</Magentotutorail_Configviewer>
</modules>
</config>
[/xml]

最后, Magentotutorial_configviewer.xml需要包含以下配置文件代码,

[xml]
<config>
<modules>
<Magentotutorial_Configviewer>
<active>true</active>
<codePool>local</codePool.
</Magentotutorial_Configviewr>
</modules>
</config>
[/xml]

再然后?不需要再然后了,你现在已经创建了一个基本的模块,当然它还什么都不能干,但是Magento已经能够识别到此模块的存在。登录Magento后台,进行如下操作,

  • 清空Magento缓存
  • 访问System->Configuration->Advanced
  • 点击”Disable modules output”,大概在最下面的位置,能够找到你刚创建的模块

找到了?恭喜你,你的第一个Magento模块创建完毕。

创建、完善模块的配置文件

向上面说的一样,这个模块目前还什么都不能做,完成本章之后,这个模块会有如下功能,

  • 检查请求路径中是否包含”showConfig”字符串
  • 如果存在该字符串,将会显示Magento的配置文件,并停止请求的默认执行
  • 检查请求路径中是否包含”showConfigFormat”字符串,它能够定制配置文件输出格式

首先,我们将下列代码中的<global>部分添加到config.xml文件中,

[xml]
<modules>

</modules>
<global>
<events>
<controller_front_init_routers>
<observers>
<Magentototurial_configviewer_model_observer>
<type>singleton</type>
<class>Magentototurial_Configviewer_Model_Observer</class>
<mothod>checkForConfigRequest</mothod>
</Magentototurial_configviewer_model_observer>
</observers>
</controller_front_init_routers>
</events>
</global>
[/xml]

然后在下面的路径中创建Ovserver.php文件,

Magentotutorial/Configviewer/Model/Observer.php

添加以下代码到该文件中,

[php]
class Magentotutorial_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());
}
}
[/php]

到此,我们的配置文件查看模块完成了,清理下Magento缓存,然后在浏览器打开存放此模块的Magento的任意地址,并加上“showConfig=true”字符串。

http://magento.example.com/?showConfig=true

我能在配置文件中找到什么有用信息?

打开上述页面之后,你会看到一个巨大的XML文件。它描述了当前运行的Magento系统的整个状态。你能够找到所有的模块,模型,类,时间监听者以及所有存在于Magento系统中的配置。

还记得本章创建模块时建立的config.xml配置文件吗?试着在浏览器中的xml文档中搜索该配置文件中包含的Configviewer_Model_Observer,你会发现刚刚创建的这个配置文件实际上也包含在这个xml文档中。总的来说Magento中所有模块的配置文件都会被解析并包含在这个全局配置文件当中。

为什么配置文件对我如此重要?

目前为止可能有些难以理解,但是这个配置文件是你学习Magento系统的关键。你添加的任何所有模块都能够在这个配置文件中找到,任何时候当你需要请求核心系统的功能时,Magento都会使用到配置文件。

举个例子,作为一个MVC程序员,你经常会使用到一些助手类,使用如下方式实例化,

[php]
$helper_sales = new HelperSales();
[/php]

而Magento是抽象化了这个过程,并非使用PHP的类声明方式。在Magento中,上面的助手类对象会使用如下方式实例化,

[php]
$helper_sales = Mage::helper(‘sales’);
[/php]

通俗的说,这个静态方法将会,

  • 在配置文件找查找<helpers />节点
  • 在<helpers />节点内,查找<sales />节点
  • 在<sales />节点内,再查找<class />节点
  • 实例化在<class />节点中找到的类

这看起来貌似费了很大的事,关键的优点是,通过在配置文件中查询类名,我们可以重写Magento核心功能,而不需要改变或添加任何代码到核心库中。这种“元编程“的方式在PHP中使用的并不多,不过它可以让你明确的扩展你想扩展的任意一个地方。

赞(0)
未经允许不得转载:锐想 » Magento开发文档(二):Magento配置
分享到: 更多 (0)

评论 14

评论前必须登录!

 

  1. #1

    Magentotutorail单词拼错啦,造成模块始终无法显示

    jesse7年前 (2012-02-20)
    • 这个之前看到了,太忙了没有时间去改~~不是在编辑器里边编辑的,写XML标签太费事了~~灰常感谢~~

      ruiwant7年前 (2012-02-20)
  2. #2

    我这边执行这个报了下面的错误。
    Method “” is not defined in “Yebihai_Configviewer_Model_Observer”

    #0 D:\work\LAMP\www\yafoshoptest\app\code\core\Mage\Core\Model\App.php(1267): Mage::throwException(‘Method “” is no…’)
    #1 D:\work\LAMP\www\yafoshoptest\app\code\core\Mage\Core\Model\App.php(1246): Mage_Core_Model_App->_callObserverMethod(Object(Yebihai_Configviewer_Model_Observer), ”, Object(Varien_Event_Observer))
    #2 D:\work\LAMP\www\yafoshoptest\app\Mage.php(424): Mage_Core_Model_App->dispatchEvent(‘controller_fron…’, Array)
    #3 D:\work\LAMP\www\yafoshoptest\app\code\core\Mage\Core\Controller\Varien\Front.php(147): Mage::dispatchEvent(‘controller_fron…’, Array)
    #4 D:\work\LAMP\www\yafoshoptest\app\code\core\Mage\Core\Model\App.php(706): Mage_Core_Controller_Varien_Front->init()
    #5 D:\work\LAMP\www\yafoshoptest\app\code\core\Mage\Core\Model\App.php(1048): Mage_Core_Model_App->_initFrontController()
    #6 D:\work\LAMP\www\yafoshoptest\app\code\core\Mage\Core\Model\App.php(340): Mage_Core_Model_App->getFrontController()
    #7 D:\work\LAMP\www\yafoshoptest\app\Mage.php(635): Mage_Core_Model_App->run(Array)
    #8 D:\work\LAMP\www\yafoshoptest\index.php(81): Mage::run(”, ‘store’)
    #9 {main}

    没找到原因,希望能解决一下,先谢了。

    John7年前 (2012-06-13)
    • method 写成 mothod…. ➡
      我说怎么类实例化了,可是方法就是进不去… ➡

      李想6年前 (2012-12-19)
      • 额,代码里边可能有些错误,不好意思~~

        ruiwant6年前 (2012-12-19)
  3. #3

    错了还不改显示不了??????????

    dsfg6年前 (2013-06-04)
  4. #4

    1.7.0.2, 检查过书写没有错误,页面刷新后还是首页,望指点

    myhip6年前 (2013-06-21)
    • 我也是,检查了错误,但刷新什么也不显示,还是首页,好像没进方法,在方法里输出不出东西

      anchen5年前 (2013-09-27)
      • 我的也是1.7.0.2也是不行 😮

        tedi32315年前 (2013-10-10)
        • 我的也是1.7.0.2 检查书写了,还是显示首页,求解啊。

          Mowill4年前 (2015-07-21)
  5. #5

    文中的Magentototurial应该改为Magentotutorial
    mothod应改为method

    Flowf6年前 (2013-08-02)
  6. #6

    mothod拼写错误啊 ,应该是method吧。。
    我的也是1.7.0.2 环境用的WAMP2.2 运行也只是刷新页面或者404

    无法运行5年前 (2014-07-04)
  7. #7

    太多拼写错误啦,

    magento爱好者4年前 (2015-03-16)

锐想电商 - 跨境电商经验交流分享

锐想无限