当前位置: 首页 > news >正文

Magento 模块开发之DispatchEvent(转)

在这一章节中,我们来了解 Magento 中的事件分发机制 Mage::dispatchEvent()
在创建自己的模块时, Event 事件的分发将会变成十分有用且有效

 

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

 

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

 

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

 

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

1
2
3
4
5
6
7
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 文件中

1
2
3
4
5
6
7
8
9
10
11
< 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()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Excellence_Test_Model_Observer
{
     public function saveOrderAfter( $evt ){
         $order = $evt ->getOrder(); //这样就能获得到在 Mage::dispatchEvent() 方法中传的参数
         $quote = $evt ->getQuote(); //这样就能获得到在 Mage::dispatchEvent() 方法中传的参数
         /*
         ....
         这里可以执行相关操作
         发送邮件
         等等...
         ....
         */
     }
}

 

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

1
2
3
4
5
6
7
8
9
Mage::dispatchEvent(
                 'model_save_before' ,
                 array ( 'object' => $this )
);
 
Mage::dispatchEvent(
                 'model_save_after' ,
                 array ( 'object' => $this )
);

转载于:https://www.cnblogs.com/zhorigtu/p/4229213.html

相关文章:

  • autohotkey在运维中的应用
  • nodeJS+express+Jade写一个局域网聊天应用(node基础)
  • ASP.NET C#.NET 通用权限管理系统组件2011年01月BUG修改情况列表清单
  • Ocelot(七)- 入门
  • flask中的session
  • mk-parallel-dump 实验
  • 配置Windows环境的DNS轮询(简单的负载均衡)
  • Out of memory (Needed 16777224 bytes)的错误解决
  • Servlet、Filter、Listener总结
  • 《The One!团队》第八次作业:ALPHA冲刺(二)
  • HttpClient 4.3.3 cookie rejected的解决办法
  • 大象也能起舞,Citrix X1计划让你对笔记本电脑say good bye
  • VOA 2009/11/02 DEVELOPMENT REPORT - In Kenya, a Better Life Through Mobile Money
  • 安装 chkrootkit报错:/usr/bin/ld: cannot find -lc
  • 大型网站技术架构(八)网站的安全架构
  • Android组件 - 收藏集 - 掘金
  • Angular 4.x 动态创建组件
  • django开发-定时任务的使用
  • download使用浅析
  • Laravel 中的一个后期静态绑定
  • nginx 配置多 域名 + 多 https
  • node.js
  • Python 基础起步 (十) 什么叫函数?
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • 分布式事物理论与实践
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 三栏布局总结
  • 深入浅出Node.js
  • 深入浅出webpack学习(1)--核心概念
  • 译米田引理
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 【干货分享】dos命令大全
  • 容器镜像
  • ​批处理文件中的errorlevel用法
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #Z0458. 树的中心2
  • #控制台大学课堂点名问题_课堂随机点名
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (搬运以学习)flask 上下文的实现
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (五)MySQL的备份及恢复
  • (一)Neo4j下载安装以及初次使用
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)visual stdio 书签功能介绍
  • .Family_物联网
  • .NET 命令行参数包含应用程序路径吗?
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET程序员迈向卓越的必由之路
  • .NET连接数据库方式
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • []C/C++读取串口接收到的数据程序