Magento Events分析和使用实例与技巧

piaoling  2011-05-12 12:53:56

当你需要扩展Magento的核心的功能时有两个选择

  • 重写(override)Magento的core classes
  • 使用Magento的event-driven 机制

由于你只能重写一次Magento的core classes(如果你需要在多个module中重写相同core class就会出现错误),所以使用Magento的Event就大显神威了,它使得你的工作简便的简易方便。

Magento的event-driven机制中有两个非常重要的概念

  • 分发(dispatch)一个事件(event)
  • 捕捉(catch)一个事件(event)

Dispatching events

Magento中你需要调用 Mage::dispatchEvent(...) 就可以Dispatch一个Event, 例: 

 

Php代码  收藏代码
  1. Mage::dispatchEvent('custom_event'array('object'=>$this));   

 

该方法有两个参数,一个是事件的标识符(在所有事件中唯一)和一个关联数组。该数组的键值是一个data(Varien_Event_Observer 的一个实例),这个data将被执行事件的函数(即observer)进行处理并返回结果。

 

Catching events

 

捕捉事件比分发复杂一些,你必须使用一个已有的module或者新建一个module.这里新建一个,目录结构如下:  

在该目录的config.xml文件中,我们新定义一个event observer,下面是参考示例(当然你可以定义不同scope的event observer):

 

Xml代码  收藏代码
  1. <events>  
  2.       <custom_event> <!-- identifier of the event we want to catch -->  
  3.         <observers>  
  4.           <custom_event_handler> <!-- identifier of the event handler -->  
  5.             <type>model</type> <!-- class method call type; valid are model, object and singleton -->  
  6.             <class>baobazacustommodule/observer</class> <!-- observers class alias -->  
  7.             <method>customObserverAction</method>  <!-- observer's method to be called -->  
  8.             <args></args> <!-- additional arguments passed to observer -->  
  9.           </custom_event_handler>  
  10.         </observers>  
  11.       </custom_event>  
  12. </events>   

  

上面的xml的配置有一个要注意的地方,就是<type />标签里的值可以是model,object,singleton,其中model和object是等效的且它们都将使用 Mage::getModel(....)方法来进行初始化;而singleton将使用Mage::getSingleton(....)来初始化。此 外,在Observer.php中就是相关的observer类的定义,该类既不需要继承其他类也不需要继承其他接口。这需要在 customObserverAction方法的参数中传入Varien_Event_Observer类的一个实例,正是这个实例对象把 dispatcher和event handler联系到一起。同时该实例对象也是继承于Varient_Object,所以拥有getter魔术方法,例:

 

Php代码  收藏代码
  1. class Baobaz_ACustomModule_Model_Observer  
  2. {  
  3.   public function customObserverAction(Varien_Event_Observer $observer)  
  4.   {  
  5.     $object = $observer->getEvent()->getObject(); // we are taking the item with 'object' key from array passed to dispatcher  
  6.     $object->doSomething();  
  7.   
  8.     return $this;  
  9. }   
  10.    

 

Default events

Magento实现了很多的events,详情参看Magento Events list

此外, Mage_Core_Model_Abstract 类默认Dispatch了一些特殊的events:

event identifier event parameters
model_save_before 'object'=>$this
{_eventPrefix}_save_before {_eventObject}=>$this
model_save_after 'object'=>$this
{_eventPrefix}_save_after {_eventObject}=>$this
model_delete_before 'object'=>$this
{_eventPrefix}_delete_before {_eventObject}=>$this
model_delete_after 'object'=>$this
{_eventPrefix}_delete_after {_eventObject}=>$this
model_load_after 'object'=>$this
{_eventPrefix}_load_after {_eventObject}=>$this

 

{_eventPrefix} means the value of $_eventPrefix variable and {_eventObject} means the value of $_eventObject variable. All classes inheriting from Mage_Core_Model_Abstract should override these variables to create specific events being dispatched. For example for catalog cagetory these variables take following values: $_eventPrefix = 'catalog_category';  $_eventObject = 'category';

 

 啊

下面是一些我个人对Magento event的理解和收集的event的资料

 

1.其实event的原理简单,就是它在你保存或读取数据之前对一些数据进 行处理,这就是event的最终目的。所以必须得在dispatcher和event handler之间传递数据,同时该数据是以Varien_Event_Observer类形式存在,底层的实现Magento已经良好的封装,更多细节 参考Mage_Core_Model_Abstract类中的一些方法(如protected  _beforeSave() 和 protected _afterSave(),Event正是在这两方法里实现的)。

2.Magento中使用Event大致分为两步:

  • Binding a function to an event
  • Implement the observer(就是function中具体实现)

3.看下面的代码:

Java代码  收藏代码
  1. Mage::dispatchEvent('newsletter_customer_subscribed', array('customer'=>$customer, 'email'=>$email));   
  2.   
  3. Mage::dispatchEvent('sales_order_status_change_after', array('order' => $order, 'status_before' => $status_before, 'status_after' => $status_after));   

 

大家发现没有,可以在array中传递多个data(关联数组就是这样用的)。

from:http://www.iteye.com/topic/692019

类别 :  magento(258)  |  浏览(3398)  |  评论(0)
发表评论(评论将通过邮件发给作者):

Email: