5

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

我的观察者调用并且我的 JS 正在检索数据,我已经通过die()在我的观察者函数中放入 acartAdd()并验证响应开发者控制台来验证这一点,我正在使用它来查看我从 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>

在 /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);
    }
}

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

我最终只是获得了由于运行添加到购物车操作而最终进入的页面内容:

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

4

1 回答 1

8

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

这种重定向行为是通过重定向来完成的,该重定向将取代动态controller_action_predispatch_checkout_cart_add事件中设置的任何重定向;参考。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_redirect在对象上设置标志checkout/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>

如果Mage_Wishlist模块不是一个因素,那么要使用的更好的目标事件将是动态生成的controller_action_postdispatch_checkout_cart_add事件,它是通用事件之前的最后一个目标controller_front_send_response_before事件。

于 2012-09-15T00:03:03.577 回答