gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:53:16 29 4
gpt4 key购买 nike

我正在尝试使用观察者来修改添加到购物车 Controller 操作的响应,但仅限于 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>

在/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 添加到购物车(这是我的最终目标)。目前我只是想解决这个问题

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

An example of the data I am seeing in the console, as shown to me by my JS code

最佳答案

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

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

就在 addAction() 中的最终重定向逻辑之前方法,购物车 Controller 的 addAction()方法调度 checkout_cart_add_product_complete 事件。 This event is observed法师_心愿单观察者。快速回顾 relevant final logic来自 Mage_Wishlist_Model_Observer::processAddToCart()方法展示了如何防止购物车 Controller 的 addAction()重定向方法 - 即通过设置 no_cart_redirect标记 checkout/session对象,它保留响应对象上的重定向集。

在这种情况下还有一个考虑因素。 很可能是法师_心愿单观察者的行为应该被保留,即:从愿望 list 中将产品添加到购物车后,客户可能会被重定向到愿望 list 中的下一个产品。这是观察者处理顺序很重要的情况之一。确保 法师_心愿单模块的添加到购物车行为被保留,其他模块使用 checkout_cart_add_product_complete事件应该在 之前触发法师_心愿单观察者。在自定义模块的声明文件中,应将 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>

如果 法师_心愿单模块不是一个因素,更好的消费目标事件将是动态生成的 controller_action_postdispatch_checkout_cart_add事件,它是通用 controller_front_send_response_before 之前的最后一个目标事件事件。

关于magento - 无法修改 Magento 事件观察者中的响应,即使观察者正在触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12432643/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com