`
天梯梦
  • 浏览: 13732623 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

Magento事件与事件监听

 
阅读更多

事件和事件监听也许是magento中最有趣的功能之一,因为它允许开发者来扩展magento应用程序中的关键部分。


为了为不同模块之间提供更多的灵活性和便利,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 Events CheatSheet (Magento事件速查表)

    ### Magento 事件速查表详解 #### 概述 Magento 是一个广受欢迎的开源电子商务平台,为开发者提供了高度可定制性和灵活性。为了更好地利用 Magento 的功能进行模块开发或扩展,理解其事件系统至关重要。本篇文章将...

    magento事件列表

    magento事件列表,英文版,做监听用的到

    Magento插件源代码

    3. **事件监听**:Magento使用事件驱动架构,Mage_Exactor_Tax可能会注册多个事件监听器来在适当的时间点插入其税务计算逻辑,如在购物车更新、订单创建时触发税额计算。 4. **资源模型**:插件可能创建了自己的...

    Magento 常用方法和插件

    通过监听系统中的特定事件,开发者可以无侵入地扩展或修改系统行为。例如,你可以创建一个观察者来在订单保存时自动执行某些操作,如发送自定义邮件或更新库存。 再者,Magento的模板引擎(Mage_Core_Model_Layout...

    Magento1产品预览

    开发者可以通过监听特定的事件,比如`catalog_product_view`,并在对应的事件处理函数中实现预览功能。这可以在`app/code`目录下的`etc/config.xml`文件中配置,并在相应的助手类或模型类中编写处理代码。 总的来说...

    magento官方文档翻译超好

    - **事件监听**:支持事件机制,可以通过注册监听器来响应数据变化。 #### 三、Magento中的数据集合(Collections) 在Magento中,数据集合是一种非常重要的数据组织方式,用于管理和操作多个相关对象。这些集合...

    magento 邮件自动发送插件

    - **事件监听器**:Magento使用事件驱动架构,插件通过监听特定的业务事件(如订单创建、发货等)来触发邮件发送。 - **模板管理**:邮件内容通常使用Magento的模板引擎生成,可以自定义设计和内容,以符合品牌形象...

    magento 限时抢购 countdown

    6. **事件与观察者**:Magento的事件驱动架构使得系统在特定事件(如用户登录、商品添加到购物车等)发生时能够触发预定义的行为。在限时抢购场景中,可以设置观察者监听促销活动开始或结束的事件,然后更新前端显示...

    magento添加多表运费

    5. **事件监听**:为了在结账流程中使用我们的运费模型,我们需要监听Magento的`sales_quote_shipping_rate`事件,当这个事件触发时,我们的计算逻辑会被调用,将运费添加到购物车或订单中。 6. **测试与部署**:...

    magento支付宝收款插件

    综上所述,"magento支付宝收款插件"是Magento电商平台与支付宝支付服务的桥梁,通过整合支付宝的支付接口,实现了Magento商店中安全便捷的在线支付功能。商家可以通过安装这个插件,为他们的客户提供更加丰富的支付...

    magento导出订单

    总结来说,"magento导出订单"涉及到的知识点包括:Magento模块开发、模型和资源模型的使用、数据收集与处理、CSV文件生成、后台界面设计、事件监听、权限控制以及性能优化策略。通过这些技术,你可以构建出一个高效...

    magento ajax search

    Magento AJAX 搜索的核心是前端与后端之间的异步通信。当用户在搜索框中输入关键词时,JavaScript 代码监听输入事件,并在用户停止输入一段时间(通常是几毫秒)后触发 AJAX 请求。这个请求发送到 Magento 后端,...

    Magento2开发者指南

    **事件和观察者**:事件和观察者模式是Magento 2中用于扩展性的关键机制之一。 **缓存**:缓存是提高性能的重要手段。Magento 2支持多种缓存类型,包括页面缓存、块缓存等。 **小部件**:小部件用于在页面上插入...

    深入理解magento

    事件观察者模式使得代码可以监听和响应系统中的特定事件,实现非侵入式的扩展和功能增强。 总结,深入理解Magento意味着要掌握其请求处理机制、页面布局设计、数据模型以及高级编程模式。这不仅需要对PHP有扎实的...

    强悍的magento放大镜插件

    在实际应用中,该插件的实现可能基于JavaScript或jQuery库,如Prototype或MooTools,它们能够轻松处理事件监听、DOM操作和动画效果。开发者可能会使用像Zoomooz或Magnific Popup这样的第三方库来实现放大镜效果,...

    Magento 添加后台管理

    如果需要在特定操作前后执行额外的逻辑,可以利用Magento的事件观察者机制。在`app/code/{Vendor}/{Module}/etc/events.xml`或`di.xml`中定义监听器,注册事件回调函数。 10. **资源权限** 需要在`app/code/{...

    Magento 1.3 PHP Developer's Guide

    - **事件与观察者**:Magento使用事件驱动架构,开发者可以通过注册观察者来监听特定事件并执行相应操作。 #### 六、支付与物流集成 - **支付方式**:支持PayPal、信用卡等多种支付方式,可以通过第三方插件扩展更...

    magento插件-将订单号改为日期流水号

    3. **事件监听**:利用Magento的事件驱动架构,监听`sales_order_save_before`等事件,在订单保存前生成新的订单号。 4. **数据库交互**:为了保持订单号的唯一性,可能需要在数据库中添加额外的记录或索引来跟踪...

    Magento-中文开发教程(技术重点2)

    观察者模式是一种常用的 Magento 扩展技术,通过注册观察者来监听特定事件并在事件发生时执行自定义代码。 - **重写类和方法** 通过在模块的配置文件中指定类和方法的重写规则,可以覆盖 Magento 的默认行为。...

Global site tag (gtag.js) - Google Analytics