在这一章节中。我们来了解 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. Pro ASP.NET Core MVC 6th 第三章

    第三章 MVC 模式,项目和约定 在深入了解ASP.NET Core MVC的细节之前,我想确保您熟悉MVC设计模式背后的思路以及将其转换为ASP.NET Core MVC项目的方式. 您可能已经了解 ...

  2. Android 读取asset文件

    * * 从Assets中读取图片 */ private Bitmap getImageFromAssetsFile(String fileName) { Bitmap image = null; As ...

  3. Flask框架 之重定向、cookie和session

    一.URL重定向(redirect) @app.route("/login") def login(): # 使用url_for函数通过视图函数的名字找到url路径 url = u ...

  4. TCP端口状态LISTENING ESTABLISHED CLOSE_WAIT TIME_WAIT SYN_SENT

    TCP状态转移要点 TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不 会被释放.网络服务器程序要同时管理 ...

  5. 牛客多校Round 8

    Solved:2 rank:164 签了两个oeis,但这样真的开心嘛

  6. c# 常用 Common

    /// <summary> /// md5加密字符串 /// </summary> /// <param name="message">< ...

  7. 网络编程 - socket实现多个连接处理

    #服务端import socket,osso_server=socket.socket()so_server.bind(("localhost",6969))so_server.l ...

  8. 「 COGS 2240 」 X 「 Luogu P2885 」 架设电话线

    解题思路 首先很容易就想到了一个二维的朴素的 $dp$. 设 $dp[i][j]$ 表示第 $i$ 个位置的电话线杆的高度为 $j$ 时的最小花费,就需要枚举第 $i$ 个电话线杆.第 $i$ 个电话 ...

  9. ZOJ - 3993 - Safest Buildings (数学)

    参考:https://blog.csdn.net/KuHuaiShuXia/article/details/78408194 题意: 描述了吃鸡刷圈的问题,给出楼的坐标点,和两次刷圈的半径R和r,现在 ...

  10. (C/C++学习)23.C++中指针的长度

    引言:先看下面一个程序会打印出什么? #include<iostream> using namespace std; int main() { int a = 2; int *p = &a ...