M1开发总结:模块etc/config.xml的解说
上一篇我们说到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>
以上结构,涉及模块声明一级标签modules、全局global标签、二级标签models、resources、blocks、helpers、events,涉及前台的是一级标签frontend,涉及后台的是一级标签adminhtml、涉及计划任务的是一级标签crontab
在此对核心、前台、后台等常用到的标签做一下基本解说,其它标签的意义就不过多解释,读者后期可自行查看代码进行深入了解
Modules核心配置
<modules>
<Mage_Sales>
<version>1.6.0.8</version>
</Mage_Sales>
</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: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标签:数据库资源读取声明 这其实就是定义模块(安装/读/写)数据库时用哪个类(资源)进行操作,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>
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>
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标签跟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开发者一些帮助。