为了扩展Magento的功能,我们可以重写Magento的代码,但因为代码只能被重写一次,所以当多个模块需要重写同一部分的代码时,就会引起冲突,好在Magento提供了另一种扩展功能的方法:事件机制,原理是在需要扩展的地方触发事件,各模块捕捉到事件后,如果有该事件的响应,便执行对应的代码,这样便实现了在多个模块中扩展程序的功能。
我们首先看一下Magento系统中预定义了哪些事件:Magento Events , 这个表格有三列,第一列是事件的名称,比如"customer_login",我们大概知道,这是用户登录时触发的事件;第二列是事件的作用域,只要有global/frontend/adminhtml这三种,分别是全局/前台/后台作用域,我们可以指定在哪些作用域响应该事件;最后一列是相应该事件的模块,比如"customer_login"事件在Catalog,Checkout,Log,Reports,Wishlist这几个模块中都有相应。ba
如果需要找到触发事件的地方,可以在《Magento Event/Observer Hooks Cheat Sheet》这个网页中搜索,比如通过查找,我们可以知道"customer_login"这个事件是在 app/code/core/Mage/Customer/Model/Session.php 这个文件中触发的,我们打开这个文件,会发现这样的代码:
class Mage_Customer_Model_Session extends Mage_Core_Model_Session_Abstract
{// ...public function setCustomerAsLoggedIn($customer){$this->setCustomer($customer);Mage::dispatchEvent('customer_login', array('customer'=>$customer));return $this;}
}

我们可以发现"customer_login"事件是在Mage_Customer_Model_Session类的setCustomerAsLoggedIn()函数中通过Mage::dispatchEvent()触发的,同时把customer变量作为参数传递给相应事件的对象。
我们再来分析模块是怎样相应事件的,仍以"customer_login"这个事件为例,我们看到Log模块响应了该事件,打开/app/code/core/Mage/Log/etc/config.xml文件,会看到这样的部分代码:
<config><frontend><events><customer_login><observers><log><class>log/visitor</class><method>bindCustomerLogin</method></log></observers></customer_login></events></frontend>
<config>

可以看到在Log模块中是在前台相应"customer_login"事件的,捕捉到这个事件时将执行"log/visitor"类的"bindCustomerLogin"方法,我们打开/app/code/core/Mage/Log/Model/Visitor.php文件,将发现这样的代码:

class Mage_Log_Model_Visitor extends Mage_Core_Model_Abstract
{// ...public function bindCustomerLogin($observer){if (!$this->getCustomerId() && $customer = $observer->getEvent()->getCustomer()) {$this->setDoCustomerLogin(true);$this->setCustomerId($customer->getId());}return $this;}
}

在触发事件时我们使用 Mage::dispatchEvent('customer_login', array('customer'=>$customer)); 的第二个参数传递变量,在bindCustomerLogin($observer)函数中使用$observer参数获取该变量$customer = $observer->getEvent()->getCustomer(),之后进行相应的扩展。

转载于:https://www.cnblogs.com/zhengyanbin2016/p/6029127.html

Magento事件机制 - Magento Event/Observer相关推荐

  1. Magento事件与事件监听

    事件和事件监听也许是magento中最有趣的功能之一,因为它允许开发者来扩展magento应用程序中的关键部分. 为了为不同模块之间提供更多的灵活性和便利,magento使用了一种事件/监听模式,这种 ...

  2. 笔试题——JavaScript事件循环机制(event loop、macrotask、microtask)

    今天做了一道笔试题觉得很有意义分享给大家,题目如下: setTimeout(()=>{console.log('A'); },0); var obj={func:function () {set ...

  3. js 循环 等待异步执行完再执行_JS异步执行机制——事件循环(Event Loop)

    JS异步执行机制--事件循环(Event Loop) 本文首发地址: 前端基础 | JS异步执行机制--事件循环(Event Loop)​www.brandhuang.com 先祭出一段代码,你清楚它 ...

  4. Spring事件机制Event源码解析(未完待续)

    Spring事件机制Event源码解析(未完待续) 监听器: ApplicationEvent事件 ApplicationListener监听器(观察者) ApplicationEventMultic ...

  5. js 异步执行_JS异步执行机制——事件循环(Event Loop)

    JS异步执行机制--事件循环(Event Loop) 本文首发地址: 前端基础 | JS异步执行机制--事件循环(Event Loop)​www.brandhuang.com 先祭出一段代码,你清楚它 ...

  6. python 线程安全的数据类型_详解python多线程、锁、event事件机制的简单使用

    详解python多线程.锁.event事件机制的简单使用 发布时间:2020-09-25 02:04:12 来源:脚本之家 阅读:117 作者:君惜 线程和进程 1.线程共享创建它的进程的地址空间,进 ...

  7. event php,PHP event 事件机制

    /* * PHP 事件机制 */ class baseClass{ private $_e; public function __set($name,$value){ if( strncasecmp( ...

  8. 我也来说说js的事件机制

    原文链接:http://www.w3cfuns.com/notes/17398/8062de2558ef495ce6cb7679f940ae5c.html 学js,不懂事件机制,基本可以说学了js,就 ...

  9. Spring事件机制详解

    一.前言 说来惭愧,对应Spring事件机制之前只知道实现 ApplicationListener 接口,就可以基于Spring自带的事件做一些事情(如ContextRefreshedEvent),但 ...

最新文章

  1. vs2017 open从v_宣布#Open2017,这是面向开发人员的除夕直播流
  2. java中如何将非整数保留到小数点后指定的位数
  3. 渲染终极者 finalRender R3.5 SE for 3ds max/design 2009/2010/2011 32位/64位 汉
  4. 科普帖:什么是服务网格?
  5. 软件测试工程师-数据库
  6. javaweb实训第一天下午——JavaScript
  7. java 锁的重入_Java 的可重入锁和不可重入锁
  8. 宠物王国6java变态版,宠物王国bt版修改器下载
  9. 【中等】迷你语法分析器
  10. Qt开发经验小技巧176-180
  11. 幼儿体能五项技能测试软件,幼儿体能训练项目及评分标准(3.5-6岁)[精制甲类]
  12. neko vm 数据包装翻译
  13. 万物互联----聊聊OPC服务器KepWare
  14. iOS 重写UIButton
  15. 【GIS小白学习笔记】Excel加至Arcgis坐标分带选择
  16. SurFS:共享式和分布式集群各取所长
  17. 空间的一组基matlab,有关线性代数的Matlab代码笔记(2)——行空间、零空间
  18. 全球bankcode解析-BIC IBAN SwiftCode BSB IFSC RoutingNumber SortCode
  19. VirtualBox 安装 Ubuntu虚拟机 显卡驱动
  20. 创建密码重置盘和重设密码

热门文章

  1. 斜挎包长度到哪里合适_斜挎包带子多长合适 看个人身高
  2. Spring Boot笔记-validation的使用及统一异常处理
  3. Qt工作笔记-使用QRegExp实现QString的split【读取文件时候,过滤各种字符】
  4. Qt文档阅读笔记-QQmlApplicationEngine解析与实例(qml与C++混合编程及QQuick与widgets混合)
  5. Linux工作笔记-两Linux系统互传文件(使用SSH)
  6. Qt工作笔记-右键删除视图中的Item【坐标映射】
  7. Qt工作笔记-QCustomplot绘制表,实现输入定位功能
  8. Qt creator5.7 OpenCV249之resize函数(含源码下载)
  9. loadrunner脚本录制为空的解决方法
  10. 二叉树经典题之将二叉树分层打印