0

我需要将一个 URL 传递给 Magento,它应该在完成注销后重定向用户。为了存储它,我执行以下操作:

$BackTo = Mage::app()->getRequest()->getParam('backto');

if(!empty($BackTo)) {
    Mage::getSingleton('core/session')->setBackTo($BackTo);
}

需要时,我使用Mage::getSingleton('core/session')->getBackTo(). 问题是,虽然这在登录时效果很好,但在注销时不起作用(最需要它的地方)。我可以存储会话变量,也可以立即检索它,但是,当我在logout.phtml重定向 JavaScript 所在的位置时,此类变量设置为null.

我怀疑 Magento 在注销时执行的重定向与这个“消失”的会话变量有关,但我不能肯定地说。

为了完整起见,这里是相关代码(代码比这更多,但它们主要是辅助功能,不会在注销时调用)。

帐户控制器

class MyPackage_Redirectplugin_AccountController extends Mage_Customer_AccountController {
    /**
     * @see AccountController:logoutAction()
     */
    public function logoutAction() {
        $this->_getSession()
            ->logout()
            ->setBeforeAuthUrl(Mage::getUrl());

        // Store the "back to" URL in a session variable
        $this->StoreBackToURL();

        $this->_redirect('*/*/logoutSuccess');
    }

protected function StoreBackToURL() {
    // Store the value of the "backto" argument, if it was passed
    $BackTo = Mage::app()->getRequest()->getParam('backto');

    if(!empty($BackTo)) {
        Mage::getSingleton('core/session')->setBackTo($BackTo);
        // At this point I can see the correct value stored in the session variable
    }
}

}

注销.phtml

// The following command returns null
$redirectURL = Mage::getSingleton('core/session')->getBackTo();

在此先感谢您的帮助。

25 年 12 月 9 日更新 - 找到了解决方法

由于我找不到将会话变量传递给重定向打开的注销页面的方法,因此我选择了另一种方法:我通过 URL 传递它。具体来说,我实现了一个logoutAction()which calls $this->_redirect('*/*/logoutSuccess', array('myvar' => $MyValue));

在模板中,我必须进行重定向,我只是使用Mage::helper('core')->urlDecode(Mage::app()->getRequest()->getParam('myvar'));.

我知道可能有更好的方法来实现整个事情,但我需要一个错误修复解决方案,这可以完成工作。感谢所有回答的人。

4

3 回答 3

2

我看到的最干净的选项(无需重写控制器!)是观察动态调度的controller_action_postdispatch_customer_account_logout事件 - 请参阅Mage_Core_Controller_Varien_Action::postDispatch(). 在控制器操作完成后调用该postDispatch()方法。

示例观察者方法:

public function logoutRedirect($obs)
{
    $redirectUrl = Mage::getUrl(/* url args */);
    $obs->getControllerAction()->getResponse()->setRedirect($redirectUrl);
}

这样做会在用户注销时直接将用户重定向到所需的 URL,这意味着将无法访问带有 JS 重定向的 logoutSuccess 页面。

如果希望 logoutSuccess 页面正常呈现,但重定向到不同的 URL,可以通过以下几种方式实现: 1. 通过创建自定义模板 2. 通过创建自定义模板块类,覆盖getUrl()方法检索您选择的 URL,并将其指定为要customer_logout在自定义布局 XML 更新文件中的内容区域中呈现的块(通过删除或替换块)。

于 2012-09-25T01:40:24.523 回答
1

只需观察此事件 customer_logout,当事件调用方法时,您将会话密钥保存在数据库中。了解更多: http: //www.magentocommerce.com/wiki/5__-_modules_and_development/reference/events

http://www.magentocommerce.com/wiki/5__-_modules_and_development/0__-_module_development_in_magento/customizing_magento_using_event-observer_method

总帐。

于 2012-09-25T01:06:18.360 回答
0

25 年 9 月 12 日更新 - 找到解决方法
此解决方法也已发布在问题本身中。

由于我找不到将会话变量传递给重定向打开的注销页面的方法,因此我选择了另一种方法:我通过 URL 传递它。具体来说,我实现了一个logoutAction()调用$this->_redirect('*/*/logoutSuccess', array('myvar' => $MyValue));.

在模板中,我必须进行重定向,我只是使用Mage::helper('core')->urlDecode(Mage::app()->getRequest()->getParam('myvar'));.

我知道可能有更好的方法来实现整个事情,但我需要一个错误修复解决方案,这可以完成工作。感谢所有回答的人。

于 2012-09-25T18:02:58.047 回答