事件和事件监听也许是magento中最有趣的功能之一,因为它允许开发者来扩展magento应用程序中的关键部分。
为了为不同模块之间提供更多的灵活性和便利,magento使用了一种事件/监听模式,这种模式允许模块之间进行松散耦合。
在这个系统中有两部分,一部分是事件分发对象和事件信息,另一部分是监听特定的事件。
一、事件分发
事 件的创建和分 发使用Mage::dispatchEvent() 函数。核心团队已经在一些核心关键部分创建了一些事件,例如,模型抽象类Mage_Core_Model_Abstract 在一个模型每次保存的时候调用了两个protected函数—— _beforeSave() 和_afterSave() ;在这些方法中有两个事件被触发。
protected function _beforeSave() { if (!$this->getId()) { $this->isObjectNew(true); } Mage::dispatchEvent('model_save_before', array('object'=>$this)); Mage::dispatchEvent($this->_eventPrefix.'_save_before', $this->_getEventData()); return $this; } protected function _afterSave() { $this->cleanModelCache(); Mage::dispatchEvent('model_save_after', array('object'=>$this)); Mage::dispatchEvent($this->_eventPrefix.'_save_after', $this->_getEventData()); return $this; }
Mage::dispatchEvent() 方法有两个参数,一个是事件的名称,另一个是保存接受数据的数组。我们可以通过数组传递值或者对象,当我们要处理对象的时候,这个就派上用场了。
为了更清楚的了解事件系统的细节,我们来看一下dispatchEvent() 方法:
public static function dispatchEvent($name, array $data = array()) { $result = self::app()->dispatchEvent($name, $data); return $result; }
这个函数实际上是app核心类Mage_Core_Model_App 中dispatchEvent() 函数的一个别名。
public function dispatchEvent($eventName, $args) { foreach ($this->_events as $area=>$events) { if (!isset($events[$eventName])) { $eventConfig = $this->getConfig()-> getEventConfig($area, $eventName); if (!$eventConfig) { $this->_events[$area][$eventName] = false; continue; } $observers = array(); foreach ($eventConfig->observers->children() as $obsName=>$obsConfig) { $observers[$obsName] = array( 'type' => (string)$obsConfig->type, 'model' => $obsConfig->class ? (string)$obsConfig->class : $obsConfig->getClassName(), 'method'=> (string)$obsConfig->method, 'args' => (array)$obsConfig->args, ); } $events[$eventName]['observers'] = $observers; $this->_events[$area][$eventName]['observers'] = $observers; } if (false===$events[$eventName]) { continue; } else { $event = new Varien_Event($args); $event->setName($eventName); $observer = new Varien_Event_Observer(); } foreach ($events[$eventName]['observers'] as $obsName=>$obs) { $observer->setData(array('event'=>$event)); Varien_Profiler::start('OBSERVER: '.$obsName); switch ($obs['type']) { case 'disabled': break; case 'object': case 'model': $method = $obs['method']; $observer->addData($args); $object = Mage::getModel($obs['model']); $this->_callObserverMethod ($object, $method, $observer); break; default: $method = $obs['method']; $observer->addData($args); $object = Mage::getSingleton($obs['model']); $this->_callObserverMethod ($object, $method, $observer); break; } Varien_Profiler::stop('OBSERVER: '.$obsName); } } return $this; }
dispatchEvent() 方法实际上做了事件/事件监听模型中的所有工作。
- 1. 获取magento的配置对象。
- 2. 遍历事件所有子节点,如果正在监听当前事件就检查
- 3. 对于每一个可用的监听事件,将会尝试实例化监听对象
- 4. 最后,magento将会调用映射到这个特定事件上的监听方法。
二、事件监听绑定
现 在分发事件仅 仅是这个过程的一部分,我们还要告诉magento我们要监听哪个事件,毫无疑问,毫无疑问,我们要通过config.xml来指定。正如我们之前看到 的,dispatchEvent() 方法可以查询到已经配置的监听事件,我们来看一个config.xml的例子。
<events> <event_name> <observers> <observer_identifier> <class>module_name/observer</class> <method>function_name</method> </observer_identifier> </observers> </event_name> </events>
event节点可以在任意一个配置部分指定(admin、global、frontend等等),我们可以指定多个event_name子节点,event_name必须要和我们要监听的dispatchEvent() 所使用的事件名称一致。
在每一个event_name 节点中,我们可以包含多个监听,但是每一个要有独特的标识符。
监听节点有两个属性,一个是类<class>,这个点用来指定我们用来监听事件的模型类,另一个是<method>,这个事用来指定实际用来监听事件的方法。我们来分析一个监听类的例子。
class Namespace_Modulename_Model_Observer { public function methodName(Varien_Event_Observer $observer) { //some code } }
关于事件监听模式最有趣的是,不需要继承任何其他的magento的类。
原文: http://blog.wangjunfeng.com/archives/540
转自: Magento事件与事件监听
相关推荐
### Magento 事件速查表详解 #### 概述 Magento 是一个广受欢迎的开源电子商务平台,为开发者提供了高度可定制性和灵活性。为了更好地利用 Magento 的功能进行模块开发或扩展,理解其事件系统至关重要。本篇文章将...
magento事件列表,英文版,做监听用的到
3. **事件监听**:Magento使用事件驱动架构,Mage_Exactor_Tax可能会注册多个事件监听器来在适当的时间点插入其税务计算逻辑,如在购物车更新、订单创建时触发税额计算。 4. **资源模型**:插件可能创建了自己的...
通过监听系统中的特定事件,开发者可以无侵入地扩展或修改系统行为。例如,你可以创建一个观察者来在订单保存时自动执行某些操作,如发送自定义邮件或更新库存。 再者,Magento的模板引擎(Mage_Core_Model_Layout...
开发者可以通过监听特定的事件,比如`catalog_product_view`,并在对应的事件处理函数中实现预览功能。这可以在`app/code`目录下的`etc/config.xml`文件中配置,并在相应的助手类或模型类中编写处理代码。 总的来说...
- **事件监听**:支持事件机制,可以通过注册监听器来响应数据变化。 #### 三、Magento中的数据集合(Collections) 在Magento中,数据集合是一种非常重要的数据组织方式,用于管理和操作多个相关对象。这些集合...
- **事件监听器**:Magento使用事件驱动架构,插件通过监听特定的业务事件(如订单创建、发货等)来触发邮件发送。 - **模板管理**:邮件内容通常使用Magento的模板引擎生成,可以自定义设计和内容,以符合品牌形象...
6. **事件与观察者**:Magento的事件驱动架构使得系统在特定事件(如用户登录、商品添加到购物车等)发生时能够触发预定义的行为。在限时抢购场景中,可以设置观察者监听促销活动开始或结束的事件,然后更新前端显示...
5. **事件监听**:为了在结账流程中使用我们的运费模型,我们需要监听Magento的`sales_quote_shipping_rate`事件,当这个事件触发时,我们的计算逻辑会被调用,将运费添加到购物车或订单中。 6. **测试与部署**:...
综上所述,"magento支付宝收款插件"是Magento电商平台与支付宝支付服务的桥梁,通过整合支付宝的支付接口,实现了Magento商店中安全便捷的在线支付功能。商家可以通过安装这个插件,为他们的客户提供更加丰富的支付...
总结来说,"magento导出订单"涉及到的知识点包括:Magento模块开发、模型和资源模型的使用、数据收集与处理、CSV文件生成、后台界面设计、事件监听、权限控制以及性能优化策略。通过这些技术,你可以构建出一个高效...
Magento AJAX 搜索的核心是前端与后端之间的异步通信。当用户在搜索框中输入关键词时,JavaScript 代码监听输入事件,并在用户停止输入一段时间(通常是几毫秒)后触发 AJAX 请求。这个请求发送到 Magento 后端,...
**事件和观察者**:事件和观察者模式是Magento 2中用于扩展性的关键机制之一。 **缓存**:缓存是提高性能的重要手段。Magento 2支持多种缓存类型,包括页面缓存、块缓存等。 **小部件**:小部件用于在页面上插入...
事件观察者模式使得代码可以监听和响应系统中的特定事件,实现非侵入式的扩展和功能增强。 总结,深入理解Magento意味着要掌握其请求处理机制、页面布局设计、数据模型以及高级编程模式。这不仅需要对PHP有扎实的...
在实际应用中,该插件的实现可能基于JavaScript或jQuery库,如Prototype或MooTools,它们能够轻松处理事件监听、DOM操作和动画效果。开发者可能会使用像Zoomooz或Magnific Popup这样的第三方库来实现放大镜效果,...
如果需要在特定操作前后执行额外的逻辑,可以利用Magento的事件观察者机制。在`app/code/{Vendor}/{Module}/etc/events.xml`或`di.xml`中定义监听器,注册事件回调函数。 10. **资源权限** 需要在`app/code/{...
- **事件与观察者**:Magento使用事件驱动架构,开发者可以通过注册观察者来监听特定事件并执行相应操作。 #### 六、支付与物流集成 - **支付方式**:支持PayPal、信用卡等多种支付方式,可以通过第三方插件扩展更...
3. **事件监听**:利用Magento的事件驱动架构,监听`sales_order_save_before`等事件,在订单保存前生成新的订单号。 4. **数据库交互**:为了保持订单号的唯一性,可能需要在数据库中添加额外的记录或索引来跟踪...
观察者模式是一种常用的 Magento 扩展技术,通过注册观察者来监听特定事件并在事件发生时执行自定义代码。 - **重写类和方法** 通过在模块的配置文件中指定类和方法的重写规则,可以覆盖 Magento 的默认行为。...