上一篇我们说到M1开发总结:模块基础常识,而这一篇,我们再进入了解一下模块的配置文件config.xml,这是magenot模块的核心,是非常折腾人的地方,以下的解释也可能比较烧脑,建议是自己找个空闲时间,同时结合config.xml慢慢阅读,好好用心掌握,理解完了也就基本上能搞明白magento了,咱先看看config.xml基本结构。
<config>
    <modules>
        <Mage_Sales>
            <version>1.6.0.8</version>
        </Mage_Sales>
    </modules>
    <global>
        <models>
            <sales>
                <class>Mage_Sales_Model</class>
                <resourceModel>sales_resource</resourceModel>
            </sales>
            <sales_entity>
               	<class>Mage_Sales_Model_Entity</class>
                <entities>
                    <quote>
                        <table>sales_quote</table>
                    </quote>
                </entities>
            </sales_entity>
            <sales_resource>sales资源标签</sales_resource>
        </models>
        <resources>
            <sales_setup>
                <setup>
                    <module>Mage_Sales</module>
                    <class>Mage_Sales_Model_Resource_Setup</class>
                </setup>
            </sales_setup>
            <sales_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </sales_write>
            <sales_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </sales_read>
        </resources>
        <template>邮件模板标签</template>
        <helpers>Helper标签<helpers>
        <blocks>block标签</blocks>
        <events>事件标签</events>
    </global>
    <frontend>
    	<routers>路由标签</routers>
        <layout>布局标签</layout>
        <events>事件标签</events>
        <translate>翻译标签</translate>
    </frontend>
    <adminhtml>
    	<routers>路由标签</routers>
        <layout>布局标签</layout>
        <events>事件标签</events>
        <translate>翻译标签</translate>
    </adminhtml>
    <default>默认值标签</default>
    <crontab>计划任务标签</crontab>
</config>
config.xml的基本结构,以xml格式来配置的<标签></标签>,实现模块的某些功能或数据定义的声明

以上结构,涉及模块声明一级标签modules、全局global标签、二级标签models、resources、blocks、helpers、events,涉及前台的是一级标签frontend,涉及后台的是一级标签adminhtml、涉及计划任务的是一级标签crontab

在此对核心、前台、后台等常用到的标签做一下基本解说,其它标签的意义就不过多解释,读者后期可自行查看代码进行深入了解


Modules核心配置
    <modules>
        <Mage_Sales>
            <version>1.6.0.8</version>
        </Mage_Sales>
    </modules>
modules标签结构

modules:是模块的声明, 下级的Mage_Sales一般跟目录路径一样的名字,Mage_Sales就代表着app/code/core下的Mage/Sales,如果是本机重写功能,如重写sales功能,那么目录会是app/code/local/Sna/Sales,而对应的<Mage_Sales>将会改成<Sna_Sales>,再下级的version就是模块的版本号,自行定义就行,如需要增加数据表之类的话,结合sql目录的下级文件名一起使用就行。
更多创建表的信息,就不过多说明自行百度或查看源代码


global全局配置 (这里面的标签是全局都有效的,不区分前后台)
<global>
	<models>
            <sales>
                <class>Mage_Sales_Model</class>
                <resourceModel>sales_resource</resourceModel>
                <rewrite>
                      <order>Sna_Sales_Model_Order</order>
                      <observer>Sna_Sales_Model_Observer</observer>
                </rewrite>
            </sales>
            <sales_entity>
               	<class>Mage_Sales_Model_Entity</class>
                <entities>
                    <quote>
                        <table>sales_quote</table>
                    </quote>
                </entities>
            </sales_entity>
            <sales_resource>
                <class>Mage_Sales_Model_Resource</class>
                <deprecatedNode>sales_mysql4</deprecatedNode>
                <entities>
                    <quote>
                        <table>sales_flat_quote</table>
                    </quote>
                </entities>
            </sales_resource>
        </models>
</global>
models标签结构

models:Model数据层的声明 magento的Model层获取数据声明就在此,有models标签就意味着能用getModel方式获取数据了,< sales>是自定义的标签,字符自己定就行,一般跟模块名字一致,而更重要一点是在调用模块时使用,如
Mage::getModel('sales/order')调用model时,sales就对应配置里面的< sales>标签,此原理同样适用于block\helper等配置……

models >sales > class标签: 声明model所对应的文件路径,Mage_Sales_Model对应是Mage/Sales/Model文件夹;

models >sales > rewrite标签: 声明model重写之用,这个标签在核心配置文件里面并没有出现,加在此位置,是为了对magento重写功能做一个说明,有rewrite标签,即意味着要对某一个功能进行重写,下级的order对应着order.php文件,里面的Sna_Sales_Model_Order代表着重写文件所处位置,如果是二级目录将会变成<order_status>Sna_Sales_Model_Order_Status<order_status>这种写法,Block\control都有着类似的写法

models >sales > resourceModel标签: 是声明资源功能(上一文提到的拿多条数据就涉及此配置),里面定的值sales_resource是自定义的(一般是当前模块名_resource的方式,也有_mysql4的写法),不管怎么写,往下还是有一个相应的<sales_resource>或<sales_mysql4>的标签;

entities:声明实体名称 什么是实体?可以理解为表实体,能看到sales_entity、sales_resource标签下都有一样的entities标签,这是定义表实体用的,要使用到数据表,可以在此位置下声明;

entities下级的quote标签:声明模块实体实例 自定义名称,与之对应的是在模块功model目录下要建立一个与之相同的Quote.php文件,实现使用getModel,功能,如:Mage::getModel('sales/quote')->load($id);将会调quote(购物车信息)

entities》quote下级table标签:其实就是表名 结合sql文件完成模块安装/升级后,就会在数据库生成一个sales_flat_quote表

        <resources>
            <sales_setup>
                <setup>
                    <module>Mage_Sales</module>
                    <class>Mage_Sales_Model_Resource_Setup</class>
                </setup>
            </sales_setup>
            <sales_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </sales_write>
            <sales_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </sales_read>
        </resources>
全局resources资源标签结构

resources标签:数据库资源读取声明 这其实就是定义模块(安装/读/写)数据库时用哪个类(资源)进行操作,sales_write是写数据库调用的是core_write,sales_read是读数据库调用的是core_read,这部分配置在实际开发中,模块开发过程中一般是从Mage核心代码复制过来,保证数据读取正常即可,在使用主从数据库的时候才会有所调整!

        <events>
            <sales_order_place_after>
                <observers>
                    <sales_vat_request_params_order_comment>
                        <class>sales/observer</class>
                        <method>addVatRequestParamsOrderComment</method>
                    </sales_vat_request_params_order_comment>
                </observers>
            </sales_order_place_after>
        </events>
		<template>
          <email>
            <sales_email_banktransfer_template translate="label" module="sales">
                <label>New Order Bank</label>
                <file>sales/order_new_bank.html</file>
                <type>html</type>
            </sales_email_banktransfer_template>
          </email>
        </template>
		<helpers>
            <snacustomer>
                <class>Sna_Customer_Helper</class>
            </snacustomer>
        </helpers>
        <blocks>
            <snacustomer>
                <class>Sna_Customer_Block</class>
            </snacustomer>
            <customer>
              <rewrite>
                  <address_edit>Sna_Customer_Block_Address_Edit</address_edit>
              </rewrite>
            </customer>
        </blocks>
template、helpers、block标签结构

events标签: 是magento事件的声明,有此标签意味着将对某些事件进行响应,执行一些逻辑处理,sales_order_place_after代表着订单结算完成后事件
template标签: 是声明邮件模板及位置的,就不多解说了
blocks标签: 是block块的声明,跟models标签是差不多的结构,block下级的snacustomer其实跟models下的sales一样的意义,可随便起,但在代码里面调用时就会用到,如CreateBlock('snacustomer'),就意味着创建一个Block块,rewrite也跟models的rewirte标签一样的意思,就不再重复了!
Helpers标签: 是帮助类的声明,与block、models差不多的,就不多解说了


frontend前台配置 (这里面的标签只对前台生效)
<frontend>
    	<routers>
            <sales>
                <use>standard</use>
                <args>
                    <module>Mage_Sales</module>
                    <frontName>sales</frontName>
                </args>
            </sales>
        </routers>
        <translate>
            <modules>
                <Mage_Sales>
                    <files>
                        <default>Mage_Sales.csv</default>
                    </files>
                </Mage_Sales>
            </modules>
        </translate>
        <layout>
            <updates>
                <sales module="Mage_Sales">
                    <file>sales.xml</file>
                </sales>
                <sales_billing_agreement module="Mage_Sales">
                    <file>sales/billing_agreement.xml</file>
                </sales_billing_agreement>
                <sales_recurring_profile module="Mage_Sales">
                    <file>sales/recurring_profile.xml</file>
                </sales_recurring_profile>
            </updates>
        </layout>
</frontend>
frontend标签结构


routers:路由标签 下级的frontName标签就是声明路由地址的,声明后就可在浏览器地址输入sales/控制器名/方法名,调用Magento的控制器,如:app/code/core/Mage/Sales/controllers/OrderController.php,对应就是sales/order/index,(index为默认值,方法名不输入则默认为index)
translate:翻译标签 声明翻译文件所在的位置,不过多解释了
layout:布局文件声明 这是一个很重要的标签,声明此模块的控制器页面输出将使用哪个布局文件进行定义,布局文件是前台View层(templete模板、block块)的重要配置文件,file标签里的值sales.xml对应的文件位置在app/design/frontend/主题包/主题/layout,主题包/主题会依据后台配置的主题而变,没有找到的话,最终会到base/default下找,而关于layout文件会在后面章节再解说。
events标签事件: 跟global的events标签一样,属于magenot事件,只不过,这里面的只对前台事件进行响应而已


adminhtml后台配置 (这里面的标签只对后台生效)
 <adminhtml>
        <translate>
            <modules>
                <Mage_Sales>
                    <files>
                        <default>Mage_Sales.csv</default>
                    </files>
                </Mage_Sales>
            </modules>
        </translate>
        <layout>
            <updates>
                <sales>
                    <file>sales.xml</file>
                </sales>
            </updates>
        </layout>
</adminhtml>
adminhtml标签结构

adminhtml标签跟frontend标签内容是差不了多少的,同样有routers:路由、ranslate:翻译、layout:布局文件声明、events事件……等标签,只不过对应着是magento后台起效果而已,这里面,就不过多说明了


关于config.xml的解说就这么多了,而magento模块的etc目录下的除了config.xml,还有api.xml(api接口的配置文件)、adminhtml.xml(后台导航/权限配置文件)…在此也就不再多解说了,留给开发者自行了解。

建议magento1的开发者多去看看magento的核心代码(app/code/core/Mage),这里面是magento系统的核心,里面每一个模块都可以看看,如:订单sales,结算checkout、用户Customer、产品Catalog…在你看完那些模块之后,自然就会有所成长

后记:

用magento1开发已经4年,从不熟悉到现在独立开发模块、拆分magento系统做独立接口去实现业务…此magento开发教程,将会从开发角度讲解一些开发细节的问题,这也算是对M1开发记录的一个小总结吧。
目前magento官方已经停止对1版本更新,但依然有很多公司还会用着M1版本(功能太多,平滑迁移还是要花时间)希望此文章能对m1开发者一些帮助。