zoukankan      html  css  js  c++  java
  • Magento 模块开发之DispatchEvent

    在这一章节中。我们来了解 Magento 中的事件分发机制 Mage::dispatchEvent()
    在创建自己的模块时, Event 事件的分发将会变成十分实用且有效

     

    以个人的经验。 事件的分发使用频率应该高于对类的重写(overriding), 为什么这么说呢, 当有多个模块的时候, 重写同一个类(class)时,那它们互相将会有冲突。 仅仅有一个模块将会正常工作, 可是假设你使用事件的话。 那么多个模块都能够非常轻松的去调用它

     

    Magento 中的事件也是依据观察者(Observer)设计模式, 它是这样工作的, 在 Magento 核心代码中, 很多地方都分发了事件。 每个事件都有自己唯一的名字和其它相关的參数, 在我们自己的模块中, 相同也能够调用这些事件, 当 Magento 分发这些事件的时候, 在我们自己模块中的一个方法将会被触发, 在这种方法中我们能够进行相关的操作

     

    Magento 调用 Mage::dispatchEvent() 方法来分发事件。 你全盘搜索一下的话,会发现 Magento 代码中非常多地方都调用了

     

    如今我们来拿 Mage_Checkout_Model_Type_Onepage 类中的 saveOrder 方法来举例


    Mage::dispatchEvent(
                    'checkout_type_onepage_save_order_after',
                    array(
                        'order'=> $order,
                        'quote'=> $this->getQuote()
                    )
    );

     

    每个事件都有自己的名字和相关參数
    在上述方法中, 'checkout_type_onepage_save_order_after' 就是自己的名字, array('order'=>$order, 'quote'=>$this->getQuote()) 就是相关參数

     

    在我们的模块中假设想调用(subscribe)或监听(listen)这个事件的时候, 须要加入例如以下代码至 config.xml 文件里


    <events>
        <checkout_type_onepage_save_order_after><!-- 事件的名字 -->
            <observers>
                <save_after><!-- 不论什么唯一的标示符 -->
                    <type>singleton</type>
                    <class>Excellence_Test_Model_Observer</class><!-- 我们自己的类(class) -->
                    <method>saveOrderAfter</method><!-- 方法名 -->
                </save_after>
            </observers>
        </checkout_type_onepage_save_order_after>   
    </events>


     

    如今在我们自己模块的 Model 目录中建立一个 Observer.php 文件, 随后定义一个方法名为: saveOrderAfter()


    classExcellence_Test_Model_Observer 
    {
        publicfunction saveOrderAfter($evt){
            $order= $evt->getOrder();//这样就能获得到在 Mage::dispatchEvent() 方法中传的參数
            $quote= $evt->getQuote();//这样就能获得到在 Mage::dispatchEvent() 方法中传的參数
            /*
            ....
            这里能够运行相关操作
            发送邮件
            等等...
            ....
            */
        }
    }


     

    另外,每当一个模块(Model)运行完保存之后,这两个事件会被触发:


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


  • 相关阅读:
    phalcon—— PHP基础知识(一)
    仿淘宝商品浏览界面, 向上拉查看详情
    linux执行run文件显示cannot execute binary file
    atitit.client连接oracle数据库的方式总结
    LeetCode203:Remove Linked List Elements
    DotNetBar.Bar图标列表的使用
    3509.com 纵横天下虚拟主机,垃圾中的战斗机
    RT-Thread内核之线程调度(三)
    CSDN-Code平台公钥设置
    2014年工作中遇到的20个问题:81-100
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7121090.html
Copyright © 2011-2022 走看看