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 方法来举例

    1
    2
    3
    4
    5
    6
    7
    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 文件中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <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()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Excellence_Test_Model_Observer
    {
        public function saveOrderAfter($evt){
            $order = $evt->getOrder(); //这样就能获得到在 Mage::dispatchEvent() 方法中传的参数
            $quote = $evt->getQuote(); //这样就能获得到在 Mage::dispatchEvent() 方法中传的参数
            /*
            ....
            这里可以执行相关操作
            发送邮件
            等等...
            ....
            */
        }
    }

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Mage::dispatchEvent(
                    'model_save_before',
                    array('object' => $this)
    );
     
    Mage::dispatchEvent(
                    'model_save_after',
                    array('object'=>$this)
    );
  • 相关阅读:
    这是在CNblogs倒闭前,本blog最后一篇随笔,请各位看官好好珍惜,主题:改变Docker Port 2376从你我做起,有图为证
    娱乐往事,年初捡到1G PAR,平淡的日子泛起波澜(小编,今天你移了多少次了?给一个说法吧,置顶了)
    DOCKER绝对领域从2048到4069?不:25519,数字的飞跃,HTTP/2
    再次聚焦DOCKER MACHINE CODE 2048
    视觉光盘,只有我可以贴全世界唯一,Windows上最高级的DOCKER客户端数字, 夜晚点击一个都没有,值班的小编辛苦了
    视觉光盘,只有我可以贴全世界唯一,你永远截不到的图片(小编请用人性化语言解释移出首页)
    深夜话题boot2docker还有那些隐藏MENU
    Go Goosy Disk Docker Port Provisioners (GDP)
    揭发233的docker/machine
    手动滑稽之golang-vmware-driver广告篇
  • 原文地址:https://www.cnblogs.com/zhorigtu/p/4229213.html
Copyright © 2011-2022 走看看