Magento 模块开发之DispatchEvent

在这一章节中,我们来了解 Magento 中的事件分发机制 Mage::dispatchEvent()

在创建自己的模块时, Event 事件的分发将会变成十分有用且有效

以个人的经验, 事件的分发使用频率应该高于对类的重写(overriding)
为什么这么说呢, 当有多个模块的时候, 重写同一个类(class)时,那它们互相将会有冲突, 只有一个模块将会正常工作, 但是如果你使用事件的话, 那么多个模块都可以很轻松的去调用它

Magento 中的事件也是根据观察者(Observer)设计模式
它是这样工作的, 在 Magento 核心代码中, 许多地方都分发了事件, 每一个事件都有自己唯一的名字和其他相关的参数, 在我们自己的模块中, 同样也可以调用这些事件, 当 Magento 分发这些事件的时候, 在我们自己模块中的一个方法将会被触发, 在这个方法中我们可以进行相关的操作

Magento 调用 Mage::dispatchEvent() 方法来分发事件, 你全盘搜索一下的话,会发现 Magento 代码中很多地方都调用了

现在我们来拿 Mage_Checkout_Model_Type_Onepage 类中的 saveOrder 方法来举例

Mage::dispatchEvent(
                'checkout_type_onepage_save_order_after',
                array(
                    'order'=> $order,
                    'quote'=> $this->getQuote()
                )
);

每一个事件都有自己的名字和相关参数

在上述方法中, ‘checkout_type_onepage_save_order_after‘ 就是自己的名字, array(‘order‘=>$order, ‘quote‘=>$this->getQuote()) 就是相关参数

在我们的模块中如果想调用(subscribe)或监听(listen)这个事件的时候, 需要添加如下代码至 config.xml 文件中

<events>
    <checkout_type_onepage_save_order_after><!-- 事件的名字 -->
        <observers>
            <save_after><!-- 任何唯一的标示符 -->
                <type>singleton</type>
                <class>Excellence_Test_Model_Observer</class><!-- 我们自己的类(class) -->
                <method>saveOrderAfter</method><!-- 方法名 -->
            </save_after>
        </observers>
    </checkout_type_onepage_save_order_after>
</events>

现在在我们自己模块的 Model 文件夹中建立一个 Observer.php 文件, 随后定义一个方法名为: saveOrderAfter()

classExcellence_Test_Model_Observer
{
    publicfunction saveOrderAfter($evt){
        $order= $evt->getOrder();//这样就能获得到在 Mage::dispatchEvent() 方法中传的参数
        $quote= $evt->getQuote();//这样就能获得到在 Mage::dispatchEvent() 方法中传的参数
        /*
        ....
        这里可以执行相关操作
        发送邮件
        等等...
        ....
        */
    }
}

另外,每当一个模块(Model)执行完保存之后,这两个事件会被触发:

Mage::dispatchEvent(
                'model_save_before',
                array('object'=> $this)
);

Mage::dispatchEvent(
                'model_save_after',
                array('object'=>$this)
);

Magento 模块开发之DispatchEvent

时间: 2024-08-25 05:44:59

Magento 模块开发之DispatchEvent的相关文章

Magento 模块开发之DispatchEvent(转)

在这一章节中,我们来了解 Magento 中的事件分发机制 Mage::dispatchEvent()在创建自己的模块时, Event 事件的分发将会变成十分有用且有效 以个人的经验, 事件的分发使用频率应该高于对类的重写(overriding), 为什么这么说呢, 当有多个模块的时候, 重写同一个类(class)时,那它们互相将会有冲突, 只有一个模块将会正常工作, 但是如果你使用事件的话, 那么多个模块都可以很轻松的去调用它 Magento 中的事件也是根据观察者(Observer)设计模式

戏说nginx模块开发之Hello world

(为了让流程更清晰,我删掉了各种错误处理与返回值判断等等,实际中还是要判断判断滴) 1.先看处理请求的handler,不是智障应该都能看懂: static ngx_int_t ngx_http_hello_handler(ngx_http_request_t *r)  {         //丢弃掉请求的body         ngx_http_discard_request_body(r);           ngx_str_t response = ngx_string("Hello w

具体解释EBS接口开发之WIP模块接口

整体说明 文档目的 本文档针对WIP模块业务功能和接口进行分析和研究,对採用并发请求方式和调用API方式分别进行介绍 内容 WIP模块经常使用标准表简单介绍 WIP事物处理组成 WIP相关业务流程 WIP相关API研究事例 (十)參考文档(七)採购相关的一些知识 (一)WIP模块经常使用标准表简单介绍 1.1   经常使用标准表 例如以下表中列出了与WIP导入相关的表和说明: 表名 说明 其它信息 BOM_STRUCTURES_B BOM头信息 BOM_COMPONENTS_B BOM组件信息

iOS开发之Socket通信实战--Request请求数据包编码模块

实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncSocket来进行长连接连接和传输数据,该第三方地 址:https://github.com/robbiehanson/CocoaAsyncSocket,读者可以自行google或者baidu搜索 这个库的用法,网上有很多资料,而且用法不难. 在一些对Socket通信使用需求不是很高的应用中,比如需要

Asp.net模块化开发之“部分版本部分模块更新(上线)”

项目开发从来就不是一个简单的问题.更难的问题是维护其他人开发的项目,并且要修改bug.如果原系统有重大问题还需要重构. 怎么重构系统不是本文探讨的问题,但是重构后如何上线部署和本文关系密切.这个大家可能刚兴趣. 言归正传,现在演示一下如果做到部分版本和部分模块更新. Asp.net模块化开发系列目录 1. Asp.net模块化开发之Mvc分区扩展框架(送源码) 2. Asp.net模块化开发之“开启分模块开发简单愉快之旅” 3. Asp.net模块化开发之“逻辑(项目)复用” 3.1. 不同角色

详解EBS接口开发之WIP模块接口

总体说明 文档目的 本文档针对WIP模块业务功能和接口进行分析和研究,对采用并发请求方式和调用API方式分别进行介绍 内容 WIP模块常用标准表简介 WIP事物处理组成 WIP相关业务流程 WIP相关API研究事例 (十)参考文档(七)采购相关的一些知识 (一)WIP模块常用标准表简介 1.1   常用标准表 如下表中列出了与WIP导入相关的表和说明: 表名 说明 其他信息 BOM_STRUCTURES_B BOM头信息 BOM_COMPONENTS_B BOM组件信息 BOM_OPERATIO

[原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图

关于如何移植SDL2.0到安卓上面来参考我的上一篇文章:[原]零基础学习SDL开发之移植SDL2.0到Android 在一篇文章我们主要使用SDL2.0来加载一张BMP图来渲染显示. 博主的开发环境:Ubuntu 14.04 64位,Eclipse + CDT + ADT+NDK 博主曾经自己使用NDK编译出了libSDL2.so,然后使用共享库的方式来调用libSDL2中的函数,结果发现SDL\src\core\android\SDL_android.c 这个jni函数写的实在是不够自己另外做

监控开发之用munin来自定义插件监控redis和mongodb

求监控组的大哥大妹子们干点事,真不容易 ! 要问他们是谁?  他们是神 .轻易别找他们,因为找了也是白找. 上次因为python和redis长时间brpop的时候,会有线程休眠挂起的情况,所有通知报警平台被下线了.这次算是完美解决了.再把他给上线.这两公司的告警已经开始往我这边的接口开始仍了. 这边正在改zabbix cmdb的控制,所以暂时不能登录.等搞好了后,让他们搞下redis和mogodb的监控,居然还让我发邮件和提供脚本及思路啥的...   一寻思,又要去zabbix,又要写脚本,还不

PDMS二次开发之PML开发一些常见查询语句

1.查找session 以及session number var !DBname DBname !db = object db(!DBname) !session = !db.lastsession() 下面是查询结果截图 q var !db q var !sessioon.number 2.从某个时间段到当前,模型的差异文件判断模型是否发生修改,并写入文件. alpha log /$!file  overwrite DIFFERENCE $!ojbName SINCE 15:36 14 May