Magento重定向后丢失消息

时间:2012-11-06 12:28:53

标签: magento

我对magento消息有疑问。我正在构建自定义模块,理论上应该能够限制对商店某些部分的访问。我创建了一个挂钩到controller_action_predispatch事件的观察者,并检查用户是否可以访问当前请求。如果无法访问操作,观察者会重定向用户并设置错误信息。我想将重定向网址设置为客户来自的网页,以避免点击整个商店。我正在查看HTTP_REFERER并在设置时使用它,否则我将客户重定向到主页。问题是在后一种情况下(主页重定向)一切都很好但是当我根据引用设置url时,我没有在消息框中看到错误消息。

观察者的代码($name变量是一个字符串):

Mage::getSingleton('core/session')->addError('Acces to '.$name.' section is denied');
$url = Mage::helper('core/http')->getHttpReferer() ? Mage::helper('core/http')->getHttpReferer()  : Mage::getUrl();
Mage::app()->getResponse()->setRedirect($url);

我觉得有趣的是,如果我在观察者文件中进行任何更改并保存它,那么下一个失败并被重定向到referer url的请求会显示错误信息,但随后会丢失消息。

我在想这个问题是在完整网址和我的本地安装(我正在使用.local域名),但所以我尝试添加

$url = str_replace(Mage::getBaseUrl(), '/', $url);

但这没有帮助。

我也尝试使用php header()函数进行重定向,但没有任何结果。

禁用所有缓存。触发问题的工作流程如下:

  1. 我要去任何可访问的页面(例如/ customer / account)
  2. 点击购物车链接(此帐户的购物车已停用)
  3. 返回/ customer / account并显示错误消息
  4. 再次点击购物车链接
  5. 返回/ customer / account但没有错误消息
  6. 任何关于在哪里看的提示都将受到赞赏。

3 个答案:

答案 0 :(得分:24)

//A Success Message
Mage::getSingleton('core/session')->addSuccess("Some success message");

//A Error Message
Mage::getSingleton('core/session')->addError("Some error message");

//A Info Message (See link below)
Mage::getSingleton('core/session')->addNotice("This is just a FYI message...");

//These lines are required to get it to work
session_write_close(); //THIS LINE IS VERY IMPORTANT!
$this->_redirect('module/controller/action');

// or
$url = 'path/to/your/page';
$this->_redirectUrl($url);

这可以在控制器中使用,但如果您在输出已经发送后尝试重定向,那么您只能通过javascript执行此操作:

<script language=”javascript” type=”text/javascript”>
window.location.href=”module/controller/action/getparam1/value1/etc";
</script>    

答案 1 :(得分:4)

您的邮件会丢失,因为您在controller_action_predispatch中使用不利方式进行重定向。您的解决方案一方面导致“消息丢失”,另一方面,它会浪费您服务器的处理能力。

当您查看Mage_Core_Controller_Varien_Action::dispatch()时,您会发现您的解决方案并未停止执行当前操作,但它应该通过重定向来执行此操作。相反,Magento会执行当前操作,包括呈现之前添加的消息。所以难怪为什么消息会因为下一个客户端请求而丢失,Magento之前已经呈现过它,服务器响应包括你的重定向。

此外,您将在Mage_Core_Controller_Varien_Action::dispatch()中看到只有一种方法可以停止执行当前操作并直接跳转到重定向,即第428行catch (Mage_Core_Controller_Varien_Exception $e) [...]。所以你必须使用Mage_Core_Controller_Varien_Exception,这是非常不受欢迎的,但却是唯一正确的解决方案。唯一的问题是,这个类有一个bug,因为它是在Magento 1.3.2中引入的。但这很容易解决。

只需创建自己的类,该类派生自Mage_Core_Controller_Varien_Exception

/**
 * Controller exception that can fork different actions, 
 * cause forward or redirect
 */
class Your_Module_Controller_Varien_Exception 
    extends Mage_Core_Controller_Varien_Exception
{
    /**
     * Bugfix
     * 
     * @see Mage_Core_Controller_Varien_Exception::prepareRedirect()
     */
    public function prepareRedirect($path, $arguments = array())
    {
        $this->_resultCallback = self::RESULT_REDIRECT;
        $this->_resultCallbackParams = array($path, $arguments);
        return $this;
    }
}

所以你现在可以用它来实现你的解决方案:

/**
 * Your observer
 */
class Your_Module_Model_Observer
{
    /**
     * Called before frontend action dispatch
     * (controller_action_predispatch)
     * 
     * @param Varien_Event_Observer $observer
     */
    public function onFrontendActionDispatch($observer)
    {
        // [...]

        /* @var $action Mage_Core_Model_Session */
        $session = Mage::getSingleton('core/session');
        /* @var $helper Mage_Core_Helper_Http */
        $helper = Mage::helper('core/http');
        // puts your message in the session
        $session->addError('Your message');
        // prepares the redirect url
        $params = array();
        $params['_direct'] = $helper->getHttpReferer() 
            ? $helper->getHttpReferer() : Mage::getHomeUrl();
        // force the redirect
        $exception = new Your_Module_Controller_Varien_Exception();
        $exception->prepareRedirect('', $params);
        throw $exception;
    }
}

答案 2 :(得分:0)

这样可行,所以试试吧:

$url = 'path/to/your/page';
$this->_redirectUrl($url);
return false;

这意味着您不允许再执行任何其他操作。