在这一章节中。我们来了解 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)
);

最新文章

  1. 如何配置Log4Net使用Oracle数据库记录日志
  2. C# 数据类型
  3. Asp.net MVC 学习系列(一)序
  4. SQL 语句集合
  5. DOM加载:浏览器渲染和操作顺序(转载 学习中。。。)
  6. C# 必应代码搜索
  7. UI4_UITableViewEdit
  8. Solution for Latex error: &quot;Cannot determine size of graphic&quot;
  9. php declare (ticks = N)
  10. 从汇编看c++初始化列表初始化成员变量
  11. Delphi 常用API 函数(好多都没见过)
  12. PHP中的常用数组操作方法
  13. windows攻击实验
  14. HTML/CSS基础知识(四)
  15. SG Input 软件安全分析之逆向分析
  16. JAVA注释的另一种神奇用法
  17. armv8 memory system
  18. java 调用 C# webapi
  19. 获取手机的唯一标示uuid
  20. Mysql数据库一:安装与创建windows服务

热门文章

  1. Windows Server 2008不能Ping改为允许的方法
  2. SpringBoot基于websocket的网页聊天
  3. vs2013打包
  4. Vue指令1:v-text及v-html
  5. yii 在lnmp下访问问题
  6. crontab定时清理日志
  7. 微信小程序 导航 4种页面跳转 详解
  8. MySQL5
  9. NFS文件服务
  10. 第十四节:Web爬虫之Ajax数据爬取