在这一章节中。我们来了解 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的更多相关文章

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

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  2. Asp.net Mvc模块化开发之“开启模块开发、调试的简单愉快之旅”

    整个世界林林种种,把所有的事情都划分为对立的两个面. 每个人都渴望的财富划分为富有和贫穷,身高被划分为高和矮,身材被划分为胖和瘦,等等. 我们总是感叹,有钱人的生活我不懂;有钱人又何尝能懂我们每天起早 ...

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

    项目开发从来就不是一个简单的问题.更难的问题是维护其他人开发的项目,并且要修改bug.如果原系统有重大问题还需要重构. 怎么重构系统不是本文探讨的问题,但是重构后如何上线部署和本文关系密切.这个大家可 ...

  4. Cocos2d-x 3.x游戏开发之旅

    Cocos2d-x 3.x游戏开发之旅 钟迪龙 著   ISBN 978-7-121-24276-2 2014年10月出版 定价:79.00元 516页 16开 内容提要 <Cocos2d-x ...

  5. 产品管理开发之Git工作流和分支规范推荐

    前言 无论是开源项目还是内部项目,使用Git都是大势所趋,尤其是在产品管理这块,使用Git大大提高了开发效率和产品的交付频率.本篇,针对Git的工作流和分支使用,进行了一些推荐. 目录 1     产 ...

  6. Python3.6编译安装以及python开发之virtualenv与virtualenvwrapper

    Python3.6编译安装 下载python源码包 先到安装目录 cd /opt 下载源码包 wget https://www.python.org/ftp/python/3.6.2/Python-3 ...

  7. Android开发之JNI(一)--HelloWorld及遇到的错误解析

    Android开发之JNI(一)--HelloWorld及遇到的错误解析 1.NDK环境搭建    參考http://blog.csdn.net/xiaoliouc/article/details/8 ...

  8. 微信公众号开发之VS远程调试

    目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 前言 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流 ...

  9. Android混合开发之WebViewJavascriptBridge实现JS与java安全交互

    前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与j ...

随机推荐

  1. Android电池电量跳变

    高通平台8916/8917 对于第三方Fuel Gauge,跳变多是因为IC内部算法的问题,这样我们可以通过驱动来规避. 例如:usb在位时,要阻止电量的向下跳变. 当电量越级跳变时,要在驱动中能检测 ...

  2. Handling unhandled exceptions and signals

    there are two ways to catch otherwise uncaught conditions that will lead to a crash: Use the functio ...

  3. Shell printf命令

    Shell 的另一个输出命令 printf.默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n. #!/bin/bash printf "%-10s %-8s %- ...

  4. 梦想CAD控件网页版扩展数据

    随着基于CAD的应用软件飞速发展,经常需要保存一些与图形可视性无关的数据,即非图形参数.例如在绘制化验样图中包含品位数据.MxCAD定义一类新的参数——实体扩展数据.扩展数据与实体的可视性无关,而是用 ...

  5. 洛谷——P3811 【模板】乘法逆元

    P3811 [模板]乘法逆元 线性求逆元 逆元定义:若$a*x\equiv1 (\bmod {b})$,且$a$与$b$互质,那么我们就能定义: $x$为$a$的逆元,记为$a^{-1}$,所以我们也 ...

  6. 安迪的第一个字典(Andy's First Dictionary,Uva 10815)

    输入一个文本,找出所有不同的单词(连续的字母序列),按字典序从小到大输出.单 词不区分大小写. 样例输入: Adventures in Disneyland Two blondes were goin ...

  7. Find The Multiple POJ - 1426 (BFS)

    题目大意 给定一个整数,寻找一个只有0,1构成的十进制数使得这个数能够整除这个整数 解法 直接bfs第一位放入1,之后每一位放入1或者0 代码 #include <iostream> #i ...

  8. MySQL数据库开启、关闭、查看函数功能的方法

    应用 MySQL 时,会遇到不能创建函数的情况.出现如下错误信息: ERROR 1418 : This function has none of DETERMINISTIC, NO SQL, or R ...

  9. 创建sum求多元素的和

    a = [1, 2, 3] b = [4, 5, 6] def sum_super(* args): s = 0 for i in args: s += sum(i) return s # print ...

  10. BZOJ 3648 寝室管理

    [题解] GDOI2016 Day2T3 如果给出的数据是一棵树那么皆大欢喜直接点分治就好了,用树状数组维护大于x的数的个数.如果是一棵基环树,我们先断掉环上的一条边,然后跑点分治:再加上经过这条边的 ...