即使观察者正在触发,也无法修改Magento事件观察器中的响应

Jos*_*ort 5 magento magento-1.7

我正在尝试使用观察者来修改添加到购物车控制器操作的响应,但仅限于AJAX请求的上下文中.

我的观察者调用,我的JS正在检索数据,我通过die()在我的观察者函数中放置一个cartAdd()并验证响应开发者控制台来验证这一点,我用它来查看我对Magento的响应结果.所以JS不是问题所在.

我的主要问题是我似乎无法通过正常功能修改响应.我用得到请求$observer->getEvent()->getControllerAction()->getResponse(),然后进行更改setHeader(),或者setBody(),或者修改响应的其他功能,但绝对是响应没有影响!

有没有人知道为什么我无法修改观察者的反应?

在/app/code/local/mynamespace/mymodule/etc/config.xml中:

<frontend>
....
    <events>
        <controller_action_predispatch_checkout_cart_add>
            <observers>
                <mymodule_cart_add>
                    <type>singleton</type>
                    <class>mymodule/observer</class>
                    <method>cartAdd</method>
                </mymodule_cart_add>
            </observers>
        </controller_action_predispatch_checkout_cart_add>
    </events>
</frontend>
Run Code Online (Sandbox Code Playgroud)

在/app/code/local/mynamespace/mymodule/Model/Observer.php中:

public function cartAdd(Varien_Event_Observer $observer)
{
    $controllerAction = $observer->getEvent()->getControllerAction();
    if($controllerAction->getRequest()->isAjax()) {
        $response = $controllerAction->getResponse();
        // I've even tried using:
        // $response = Mage::app()->getResponse();
        $response->setHeader('HTTP/1.1','403 Forbidden'); //using this because i will need it in my final code and it will make it immediatly obvious the response has been changed
        $response->setHeader('Content-type', 'application/json');
        $response->setBody('hello world!!!!');
        // this is to stop the product from being added to the cart
        $controllerAction->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意:我知道这段代码根本不适用于添加到购物车的AJAXify(这是我的最终目标).目前我只是想解决这个问题

我最终只是获取了由于运行添加到购物车操作而最终会出现的页面内容:

我在控制台中看到的数据示例,如我的JS代码所示

ben*_*rks 8

将产品添加到购物车时,可以通过管理员配置行为将人员发送到购物车页面或将其重定向回产品页面.请参阅系统>配置>结帐>购物车:将产品重定向添加到购物车字段后.

此重定向行为是通过重定向完成的,该重定向将取代动态controller_action_predispatch_checkout_cart_add事件中的任何重定向集; REF.逻辑的最终位Mage_Checkout_CartController::addAction().不过没有恐惧!Magento核心开发人员也需要覆盖此行为,因此如果在对象上设置了标志,则可以通知Mage_Checkout购物车控制器的addAction()方法绕过正常的重定向行为checkout/session.不仅有一个钩子和支持逻辑使其工作,但实际上有一个来自核心的工作示例 - 对开发人员来说总是一件好事.

就在方法中的最终重定向逻辑之前addAction(),购物车控制器的addAction()方法调度checkout_cart_add_product_complete事件.此事件被观察到Mage_Wishlist观察者.从该方法快速回顾相关的最终逻辑,Mage_Wishlist_Model_Observer::processAddToCart()显示如何防止购物车控制器的addAction()方法重定向 - 即通过no_cart_redirectcheckout/session对象上设置标志,该标志保留响应对象上的重定向集.

在这种情况下还有一个考虑因素.可能应该保留Mage_Wishlist观察者行为,即:在从愿望清单向购物车添加产品之后,可以将客户重定向到其愿望清单中的下一个产品.这是观察员处理顺序重要的一个例子.为了确保Mage_Wishlist模块的添加到购物车行为得到保留,消耗该checkout_cart_add_product_complete事件的其他模块应该在Mage_Wishlist观察者之前触发.在自定义模块的声明文件中,Mage_Wishlist模块应设置为依赖于自定义模块,这将确保自定义模块的观察者将在Mage_Wishlist模块之前触发:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Custom_Module>
            <active>true</active>
            <codePool>local</codePool>
        </Custom_Module>
        <Mage_Wishlist>
            <depends>
                <Custom_Module />
            </depends>
        </Mage_Wishlist>
    </modules>
</config>
Run Code Online (Sandbox Code Playgroud)

如果Mage_Wishlist模块不是一个因素,那么更有针对性的事件将是动态生成的controller_action_postdispatch_checkout_cart_add事件,这是泛型controller_front_send_response_before事件之前的最后一个目标事件.