西部数码主机 | 阿里云主机| 虚拟主机 | 服务器 | 返回乐道官网
当前位置: 主页 > php教程 > magento教程 >

在Magento核心动作前后调用事件

时间:2017-01-01 00:04来源:未知 作者:好模板 点击:
正如我们所知的,Magento中有些事件被默认地调度。我们可以轻易地挂钩这些事件,但这不是这篇文章的主题。我们要尝试的是在一些Magento控制器的一些动作前后添加自定义事件。 这样

正如我们所知的,Magento中有些事件被默认地调度。我们可以轻易地挂钩这些事件,但这不是这篇文章的主题。我们要尝试的是在一些Magento控制器的一些动作前后添加自定义事件。

这样,我们就不需要事件被默认调度。当然,有些事件需要多做一点处理(例如,如果你需要一些session的东西,session在动作之后要被清除),但是大部分情况,有一种方法可以从事件中获取我们想要的。

例如,“Mage_Checkout_CartController”中的“addAction()”方法,我们可以用标准的方式重写这个方法并在重写的类里调度我们的事件。但我们可以做些类似这样的事情。

添加下面的代码到你模块的config.xml文件:

< ?xml version="1.0"?>
<config>
    <global>
        <models>
            <dispatcher>
                <class>Alwayly_Dispatcher_Model</class>
            </dispatcher>
        </models>
    </global>
    <frontend>
        <events>
            <!-- Hooking to Magento's default event "controller_action_predispatch" -->
            <controller_action_predispatch>
                <observers>
                    <controller_action_before>
                        <class>dispatcher/observer</class>
                        <method>hookToControllerActionPreDispatch</method>
                    </controller_action_before>
                </observers>
            </controller_action_predispatch>
            <!-- Hooking to Magento's default event "controller_action_postdispatch" -->
            <controller_action_postdispatch>
                <observers>
                    <controller_action_after>
                        <class>dispatcher/observer</class>
                        <method>hookToControllerActionPostDispatch</method>
                    </controller_action_after>
                </observers>
            </controller_action_postdispatch>
            <!-- Hooking to our own event "add_to_cart_before" -->
            <add_to_cart_before>
                <observers>
                    <add_to_cart_before>
                        <class>dispatcher/observer</class>
                        <method>hookToAddToCartBefore</method>
                    </add_to_cart_before>
                </observers>
            </add_to_cart_before>
            <!-- Hooking to our own event "add_to_cart_after" -->
            <add_to_cart_after>
                <observers>
                    <add_to_cart_after>
                        <class>dispatcher/observer</class>
                        <method>hookToAddToCartAfter</method>
                    </add_to_cart_after>
                </observers>
            </add_to_cart_after>
        </events>
    </frontend>
</config>

添加下面的代码到你模块的Observer.php

class Alwayly_Dispatcher_Model_Observer
{
    //this is hook to Magento's event dispatched before action is run
    public function hookToControllerActionPreDispatch($observer)
    {
        //we compare action name to see if that's action for which we want to add our own event
        if($observer->getEvent()->getControllerAction()->getFullActionName() == 'checkout_cart_add') 
        {
            //We are dispatching our own event before action ADD is run and sending parameters we need
            Mage::dispatchEvent("add_to_cart_before", array('request' => $observer->getControllerAction()->getRequest()));
        }
    }
 
    public function hookToControllerActionPostDispatch($observer)
    {
         //we compare action name to see if that's action for which we want to add our own event 
        if($observer->getEvent()->getControllerAction()->getFullActionName() == 'checkout_cart_add') 
        {
            //We are dispatching our own event before action ADD is run and sending parameters we need
            Mage::dispatchEvent("add_to_cart_after", array('request' => $observer->getControllerAction()->getRequest()));
        }
    }
 
 	public function hookToAddToCartBefore($observer) 
	{   
            //Hooking to our own event
	    $request = $observer->getEvent()->getRequest()->getParams();
            // do something with product
	    Mage::log("Product ".$request['product']." will be added to cart.");
	}
 
	public function hookToAddToCartAfter($observer) 
	{
            //Hooking to our own event
	    $request = $observer->getEvent()->getRequest()->getParams();
            // do something with product
	    Mage::log("Product ".$request['product']." is added to cart.");
	}
}

最后,我要指出的是:这段代码没有在产品环境中做测试,我们只是添加了两个自定义事件在Magento核心动作的前后,而不必重写这个类。

(责任编辑:好模板)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
热点内容