【问题标题】:Can't modify response in a Magento event observer, even though observer is firing无法修改 Magento 事件观察者中的响应,即使观察者正在触发
【发布时间】:2012-09-08 02:21:27
【问题描述】:

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

我的观察者 调用并且我的 JS 检索数据正常,我已经通过在我的观察者函数 cartAdd() 中放置一个 die() 并验证我正在使用的响应开发者控制台来验证这一点查看我的 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 添加到购物车(这是我的最终目标)。目前我只是想解决这个问题

我最终只是获得了您在运行添加到购物车操作后最终会访问的页面内容:

【问题讨论】:

  • 99% 确定在触发动态预调度事件后,请求上设置了不同的重定向。现在确认,将回答。

标签: magento magento-1.7


【解决方案1】:

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

此重定向行为是通过重定向完成的,该重定向将替换动态controller_action_predispatch_checkout_cart_add 事件中设置的任何重定向; ref. the final bit of logic 来自 Mage_Checkout_CartController::addAction()。不过,不要害怕! Magento 核心开发人员也需要覆盖此行为,因此如果在 @987654328 上设置了标志,则可以通知 Mage_Checkout 购物车控制器的 addAction() 方法绕过正常的重定向行为@ 目的。不仅有一个钩子和支持逻辑让它工作,而且实际上还有一个来自核心的工作示例 - 对开发人员来说总是一件好事。

就在addAction() 方法中的最终重定向逻辑之前,购物车控制器的addAction() 方法调度checkout_cart_add_product_complete 事件。 This event is observedMage_Wishlist 观察者提供。快速回顾Mage_Wishlist_Model_Observer::processAddToCart() 方法中的relevant final logic 展示了如何防止购物车控制器的addAction() 方法重定向 - 即通过在checkout/session 对象上设置no_cart_redirect 标志,它保留了响应对象上设置的重定向.

在这种情况下还有一个考虑因素。很可能应该保留 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 事件之前的最后一个目标事件。

【讨论】:

  • 非常有用的信息,谢谢!我还注意到未登录时这些事件会被完全绕过,但这可能是我的环境所特有的。 customer/session-&gt;authenticate() 在某处被调用并重定向到登录页面,而无需咨询 no_cart_redirect 标志。这没关系,因为除非在我的情况下打算登录,否则无法添加到购物车。我只会让前端的行为有所不同。再次感谢
  • @benmarks 一如既往的好答案。顺便说一句,我不明白:$this-&gt;_getSession()-&gt;getNoCartRedirect(true)。 args true 是什么意思?看起来标志no_redirect_flag 仅在Varien_Object 中设置/获取为数据,因为我没有发现它在checkout/session 模型中明确定义为attribute。我说的对吗?
  • @ivantedja 会话模型有一个修改过的 getter。通过传入 true 来检索值,然后取消设置属性。
  • @benmarks 哦,好的,我明白了。没想到会改。谢谢,我正在学习新东西(下次应该检查所有可能性)
  • @ivantedja 我很少打开我的 IDE 而不学习有关 Magento 的新知识 :-)
猜你喜欢
  • 2016-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多