【问题标题】:Redirect in CheckOut在 CheckOut 中重定向
【发布时间】:2025-12-07 14:55:01
【问题描述】:

我目前正在开发一个 magento 支付模块,该模块必须检查用户个人资料/帐户中的某些字段是否已设置。

如果它们不存在/没有内容,我想要么 1. 重定向到 /customer/account/edit/ 2. 显示需要填写相关字段的通知

或者反过来。

这是由 Magentos 核心 OnePage Checkout 的 AJAX 调用初始化的。

我尝试了几种方法,例如

Mage::app()->getFrontController()->getResponse()->setRedirect(Mage::getUrl('customer/account/edit/'));
    Mage::app()->getResponse()->sendResponse();
    exit;

还有其他的。

从观察者那里,我以某种方式获得了重定向,但总是以 /default/checkout/cart 结尾(这是默认值?)

在模型中,我在 chromes 网络选项卡中看到加载了正确的页面,但不知何故它不会重定向到该页面。

如果您需要有关该问题的更多信息,请告诉我。

编辑 1:去掉了第二个 Mage::getURL,仍然没有重定向。

编辑 2:我想如果我能以某种方式“劫持”对 opcheckout.js 的响应,它就可以进行重定向。或者我应该添加一个额外的 js 来监听吗?我认为因为漏洞是由 AJAX 调用触发的,所以重定向不会发生在正确的位置。欢迎更多想法。

编辑 3:我目前试图弄清楚如何为提到的 opcheckout.js 构建响应,该响应不会触发下一步但会触发重定向

【问题讨论】:

  • 你有两个嵌套的Mage::getUrl(),这可能是为什么觉得奇怪?
  • 感谢您的提示,我编辑了问题。它没有将目标加载到 chrome 网络选项卡,但仍然没有重定向。

标签: magento


【解决方案1】:

解决了

解决方案:

创建一个覆盖
  • /app/code/core/Mage/Checkout/controllers/OnepageController.php

这应该是例子

  • app/code/local/{NameSpace}/{ModuleName}/controllers/OnepageController.php

特别注意文件夹中的“s”是复数而不是单数。我花了十分钟才知道为什么我的控制器不工作。

控制器应该是这样构建的:

require_once Mage::getModuleDir('controllers', "Mage_Checkout").DS."OnepageController.php";
    class MOOD_BonimaScoreIdent_OnepageController extends Mage_Checkout_OnepageController {
       public function indexAction(){
            parent::indexAction();
       }

       public function savePaymentAction(){
         //just an example
        $result['redirect']=Mage::getUrl('customer/account/edit/');
        $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
       return;
       }
    }

包含控制器覆盖的 config.xml 部分很简单:

<frontend>
<routers>
                <checkout>
                    <args>
                        <modules>
                            <MyModuleName before="Mage_Checkout">Namespace_MyModuleName</MyModuleName>
                        </modules>
                    </args>
                </checkout>
        </routers
</frontend>

【讨论】: