`
yanggaojiao
  • 浏览: 81712 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多

当你需要扩展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, 例: 

 

Mage::dispatchEvent('custom_event', array('object'=>$this)); 

 

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

 

Catching events

 

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

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

 

<events>
      <custom_event> <!-- identifier of the event we want to catch -->
        <observers>
          <custom_event_handler> <!-- identifier of the event handler -->
            <type>model</type> <!-- class method call type; valid are model, object and singleton -->
            <class>baobazacustommodule/observer</class> <!-- observers class alias -->
            <method>customObserverAction</method>  <!-- observer's method to be called -->
            <args></args> <!-- additional arguments passed to observer -->
          </custom_event_handler>
        </observers>
      </custom_event>
</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魔术方法,例:

 

class Baobaz_ACustomModule_Model_Observer
{
  public function customObserverAction(Varien_Event_Observer $observer)
  {
    $object = $observer->getEvent()->getObject(); // we are taking the item with 'object' key from array passed to dispatcher
    $object->doSomething();

    return $this;
} 
 

 

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.看下面的代码:

Mage::dispatchEvent('newsletter_customer_subscribed', array('customer'=>$customer, 'email'=>$email)); 

Mage::dispatchEvent('sales_order_status_change_after', array('order' => $order, 'status_before' => $status_before, 'status_after' => $status_after)); 

 

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

分享到:
评论
1 楼 richardlovejob 2010-07-16  
这个分享是在太及时了,谢谢。

相关推荐

    Magento Events CheatSheet (Magento事件速查表)

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

    magento数据结构分析

    标题:“Magento数据结构分析” 描述:“Magento数据字典”提供了对Magento系统中各种数据库表的深入理解,这对于理解和优化Magento的性能至关重要。 一、Magento数据结构解析 Magento是一款功能强大的电子商务...

    magento使用和开发

    以下将详细介绍Magento的使用和开发相关知识点。 首先,Magento的特色在于其强大的电子商务功能和灵活性。它支持多网站和多商店管理,允许商家在一个后台管理多个网站或商店。其程序架构分为内核(Core)、本地模块...

    Magento 常用方法和插件

    总的来说,熟悉Magento的常用方法和插件,不仅包括对核心框架的理解,还要掌握模块化开发、事件驱动、布局和模板引擎的使用,以及插件开发和调试技巧。同时,利用合适的开发工具可以极大地提升开发效率和代码质量。...

    magento用户使用手册

    ### Magento用户使用手册知识点概述 #### 第一章:Magento介绍 **Magento的特色:** - **高度可定制性:** Magento允许商家根据自己的业务需求定制前端和后端。 - **强大的社区支持:** Magento拥有一个庞大的...

    magento结构和原理

    magento结构和原理 magento结构和原理是magento...通过了解magento的文件目录结构、URL路由与分发器、模板调用对应的JS、CSS、图片、重写核心模块等知识点,可以更好地理解magento的工作机理和开发magento模块和主题。

    magento 二次开发模块实例(代码)

    本实例提供了具体的模块开发代码,帮助开发者深入理解Magento的架构和工作原理。 首先,我们需要了解Magento的模块化结构。在Magento中,每个功能或服务都是一个模块,这些模块通过定义在`app/etc/modules`目录下的...

    Magento php开发指南

    Magento是一款流行的开源电子商务平台,其功能强大且模块化,它支持...通过学习本指南,开发者可以掌握Magento开发的基础知识和高级技巧,能够为电子商务项目提供定制化的解决方案,有效地提升网站的功能性和用户体验。

    Magento1.6样例数据及使用说明

    使用Magento样例数据不仅可以加快开发和测试速度,还可以帮助新手更快地理解和学习Magento的架构和工作原理。它是一个宝贵的资源,尤其是对于那些初次接触Magento的开发者或店主来说,能提供一个直观的学习平台。 ...

    Magento用户使用和开发手册

    这份“Magento用户使用和开发手册”涵盖了Magento的各个方面,包括基础操作、商店设置、产品管理、订单处理以及高级开发技巧。 首先,让我们从用户使用手册开始。这份PDF文件详细介绍了如何在Magento平台上进行日常...

    home-appliances magento 模板,magento 1.7 使用. 外贸站模板。

    在安全方面,虽然Magento 1.7已不再接收官方的安全更新,但你可以通过定期备份、使用安全插件和保持服务器安全来保护你的网站。另外,考虑升级到更现代的Magento版本(如Magento 2)可以带来更多的性能提升和安全...

    magento创建自定义页面 (Bestseller实例) Bestseller products in Magento

    在这个实例中,我们将深入探讨如何在Magento中创建一个显示“Bestseller”产品的自定义页面。 首先,理解Magento的模块化结构至关重要。每个功能或特性在Magento中都对应一个模块,模块是Magento的基本构建单元。...

    hellowired magento 模板,magento 1.7 使用. 外贸站模板。

    Magento是一款强大的开源电子商务平台,专为在线商家设计,提供丰富的功能和高度的可定制性。在本主题中,我们关注的是“hellowired”Magento模板,特别针对magento 1.7版本,这是一个专为外贸站点设计的模板。 ...

    magento快速复制网站_magento_magento快速复制站_

    这包括所有的 Magento 根目录文件以及媒体、skin和var等目录。可以使用`rsync`或FTP客户端完成这一操作: ```bash rsync -avz --delete /path/to/source/magento/ /path/to/destination/ ``` 这里,`/path/to/...

    magento-java-master.zip_magento

    6. **Spring Integration**:如果使用Spring框架,可以考虑使用Spring Integration模块来简化与Magento的集成。它提供了对HTTP、SOAP和其他协议的高级抽象,可以更方便地处理API调用。 7. **测试**:编写单元测试和...

    Magento创建管理列表和后台模块实例

    如果你正在创建一个Magento的管理模块(学习创造Magento管理模块),那么你一定会被要求创建一个管理列表既Grid。创建列表,Magento新手程序员有点困难,但在本教程中,我们将创建一个网格在管理模块中最简单的方式...

    Magento实例讲解

    Magento实例讲解

Global site tag (gtag.js) - Google Analytics