作者 lizhanghan
转载:http://www.evebit.com/about/developers-blog/item/169-to-the-understanding-of-the-magento-developers/
magento是一款新的专业开源电子商务平台,设计灵巧,具有模块化架构体系和丰富的功能。对magento的模块及模块中的块,控制器,模型,辅助类,布局,配置文件,模板文件等相关知识的了解:
1:代码池
magento 中所有的模块被放在三个代码池中,它们分别是 core , local , communitymagento 本身所附带的模块全部放在 core 代码池中。我们自己开发的模块则就安装在 local 代码池中。 community 代码池则是用来安装第三方模块,但是,有时候,模模块也可以安装在 community 代码池中。
2:模块
模块是magento的核心,站点的任何动作(无论前台还是后台)都是通过模块来实现的,它包 扩:block,etc,model,helpers,sql,controllers。magento的系统模块在以下目录:app/code /core/Mage 每一个子目录都是一个单独的模块,是由Magento官方开发的。我们自己创建的模块放在以下目录:app/code/local或ap/code /community如我们在app下的community下创建一个模块app/code/community/Whct/Plan:
我们要创建一个系统配置文件app/etc/modules/Whct_All.xml中来激活它:
<config>
<modules>
<Whct_Plan>
<active>true</active>
<codePool>community</codePool>
<depends>
<Mage_Adminhtml/>
</depends>
</Whct_Plan>
<modules>
<config>
一个模块可以包含全部的这六项也可以只包含其中的几项,甚至只有一项。所有的模块可以通过 app/etc/modules/ 目录中 XML 配置系统来进行开关。每个模块也可以在自己模块目录下的 etc 子目录中创建一个 XML 文件来保存自己的配置信息。由于 magento 中的一切都是模块而且模块本身又可以有自己的配置文件和数据库设置,这样就允许开发人员对 magento 进行扩展。
3:配置文件(Config.xml)
模块的配置文件保存在模块目录下的etc子目录中。每一个模块都可以有三个配置文 件:config.xml,system.xml,convert.xml。其中,config.xml会直接影响我们模块的行为,后两个则会在后台配置 时创建表单,而所有的配置文件都会被组合到一起。我们可以在配置文件的XML标签中设置配置来重写或者覆盖模块的相应配置。
任何时候。我们需要调用一个系统功能的时候,Magento都会调用这个配置文件来查询相应的模块和功能。
在Whct的ERP开发中,我们以模块app/code/whct/plan为例说明。我们需要创建两个XML文件,第一个为app/etc/modules/Whct_All.xml
第二个为app/code/community/Whct/Plan/etc/config.xml
<config>
<modules>
<Whct_Plan>
<active>true</active>
<codePool>community</codePool>
<depends>
<Mage_Adminhtml/>
</depends>
</Whct_Plan>
<modules>
<config>
4:配置路由
路由是把一个URL请求转换成一个执行控制器和方法。我们在Config.xml中添加如下代码:
4:包 (Package)
所有的模块都不是直接保存代码池目录中,而是保存在包目录(代码池的子目录) 中。引入包概念的主要目的是类命名的统一和一贯性。所有的 magento 模块是保存在 core 代码池中的 Mage 包中。所以,所有的 magento 类名都以 Mage_ 为前缀。
5:模型(Model)
它主要是用来从数据库提取数据到程序中。数据的输出,呈现是通过块 (Block) 来实现的。也就是说它主要是用来负责数据库操作的。以下是app/code/community/Whct/Plan/Model下的相关文件:
6:块(Block)
每个块对应一个模板文件 ——模板文件是以 .phtml 为扩展名的 html 和 php 代码混合的文件。也就是说对于在 magento 上的任何一个请求,其实你在处理的是一系列的块对象和相应数量的模板文件。
7:布局文件(layout)
布局文件控制了页面的最终结构,所有的布局文件保存在当前主题的 layout 目录下。所有布局文件的名称都和相应的模块名一样,只不过它们都使用小写,而模块名使用所谓的骆驼式命名法。其中最重要的布局文件是 page.xml 文件page.xml 文件指定了默认的页面结构。从其它的 xml 文件的修改是来自 default 标签下的设置。下列是布局文件中常用的标签:ayout,default,reference,block,action,update
<layout>
<!-- admin acl roles grid page -->
<adminhtml_permissions_role_index>
<reference name="content">
<block type="adminhtml/permissions_roles" name="adminhtml.permission.role.index" template="permissions/roles.phtml">
<block type="adminhtml/permissions_grid_role" name="adminhtml.permission.role.grid" as="grid"/>
</block>
</reference>
</adminhtml_permissions_role_index>
</layout>
在上面的代码中实现了两个Block的嵌套。</reference>:引用另一个Block来覆盖当前的Block。as:指定模板中会调用哪一个区块。
8:模板文件(template)
模板文件是在html文件中嵌套使用php代码,以.phtml为后缀名。它使用php语法特性,我们可以看见以endif,endwhile,endfor这样的语法结构,以及使用冒号的的循环结构,如下:
9:控制器(Controller)
控制器是所有业务逻辑的起点。它继承了Mage_Core_Controller_Varien_Action基类,它是Zend框架的Zend_Core_Controller_Action的修改版本。主要方法有:
Dispatch($action),Predispatch(),Postdispatch()方法。Dispatch()方法首先启动当前业务逻辑,$action则由当前URL决定。Dispatch方法首先调用Predispatch方法,然后再触发以下事件:
controller_action_predispatch
controller_action_predispatch_ModuleName
controller_action_predispatch_ModuleName_ControllerName_ActionName
dispatch 方法只会在 predispatch 方法末将当前请求标记为 dispatched 时被调用,最终它会调用相应的控制器实例中对应的 action 方法。
10:辅助类(helper)
helper类:主要放置一些不适合放在模型,视图或者控制器里面的功能。helper有两个重要的接口:__(两个下划线),HtmlEscape。: 它是一个翻译接口,我们可以在代码的任何地方调用它来翻译字符串。 HtmlEscape:它封装了Htmlspecialchars方法。Magento抽象了PHP得类声明方式 ($helper_salerule=NewMage_SaleRule_Helper();):$helper_salerule= Mage::helper(‘salerule’);我们通过以下逻辑来处理该代码:在配置文件中查找<helpers/>标签 在<helpers/>里面查找<salerule/>标签在<salerule/>里面查找<class />标签实例化(3)中找到的类Mage_SaleRule_Helper
11:主题(Themes)
一个主题是由布局,模板,皮肤(skin)文件组成。
12:Collection
在magento中,我们使用Varien_Data_Collection来做数据收集。
13:magento的请求分发与控制器流程:首先,URL被一个PHP文件拦截,这个PHP文件会实例化一个magento对象。该magento对象 实例化一个前端控制器,前端控制器再实例化全局配置中指定的路由对象。路由对象会逐个与请求的URL匹配,若匹配成功,则获得一个执行控制器和一个执行方 法。实例化控制器,并调用执行法。执行方法中处理业务逻辑和模型数据,控制器实例化布局对象。布局对象根据请求的参数,系统配置创建一个块对象的列表,并 实例化。)布局对象会调用块对象的output方法生成Html。这可以是一个递归过程,因为块对象包可以嵌套块对象。每一个块对象都和一个模板文件对 应,块对象包含了现实逻辑,模板文件包含了Html和php输出代码。块对象直接从模板那里获取数据,在magento的MVC中,控制器不直接把数据传 给视图。每一次magento的请求实际上是处理一系列的block对象和相应的模板文件,并且所有的block类都继承 Mage_Core_Block_Template类,而这个类又继承Mage_Core_Block_Abstract类。我们主要使用ToHtml来 调rendview()生成Html。
14:在公司的ERP开发学习中的总结
我们现在“计划管理”菜单下添加子标签
先在模块Plan下的Block中添加文件夹Subplan,在其下还应创建相应的Tab和Edit文件夹及以下子目录php文件,在 Controllers中创建SubplanController.php文件。Subplan目录下的文件可以参考Plan中相应的文件进行创建。然 后,我们在Whct/Plan/etc下的adminhtml.xml中添加“子计划”内容进行配置。
(1)在子计划的列表中添加level和编号
我们需要在Subplan文件夹下添加Grid.php文件在该文件中class Whct_Plan_Block_Subplan_Grid extends Mage_Adminhtml_Block_Widget_Grid中的protected function _prepareColumns() 方法中添加以下代码:
效果如图:
(2)以上,我们在子计划中提取了level为2的计划信息,为此,我们需要对计划的level进行数据的过滤操作:我们在class Whct_Plan_Block_Subplan_Grid extends Mage_Adminhtml_Block_Widget_Grid中添加如下代码
我们调用Mage:getModel()中的getCollection()方法来获取模块plan数据库查询的结果 集,$collection->addFieldToFilter('level', 2);过滤数据只选择结果集中level为2的数据集。点击添加新计划,在计划信息的计划页面中,我们在计划名称下添加字段“父计划”
操作:在Subplan文件夹下的Main.php中class Whct_Plan_Block_Subplan_Tab_Main extends Mage_Adminhtml_Block_Widget_Form类下
添加如下代码
(4)在添加“父计划”,并在“父计划”页面中显视“父计划”页面
我们首先在Subplan文件夹下的Leftplan.php添加如下代码:
该段代码实现在计划信息页面中添加“父计划”字段。然后再Subplan目录下添加Subpgrid.php.在改php文件实现
这个类。并添加相应代码如下:在_prepareCollection()中我们筛选出level为1的计划,即level为2的父计划。然后,调用_prepareColumns()中实现“选择父计划”的单选按钮。