Magento:在会话超时后,重写的控制器无法重定向到登录页面

时间:2013-01-18 13:14:15

标签: magento magento-layout-xml

我们已经为Magento购买了嵌入式ERP扩展。我们已经定制了它,并且还重写了几个控制器。这是我的config.xml文件的片段

   <admin>
    <routers>
        <mdn_extended>
            <!-- should be set to "admin" when overloading admin stuff (?) -->
            <use>admin</use>
            <args>
                <module>MDN_Extended</module>
                <!-- This is used when "catching" the rewrite above -->
                <frontName>mdn_extended</frontName>
            </args>
        </mdn_extended>
    </routers>

</admin>

  <global>
   <rewrite>
        <mdn_extended_advancedstock_warehouse>
            <from><![CDATA[#^/AdvancedStock/Warehouse/#]]>
            </from>
            <to>/mdn_extended/AdvancedStock_Warehouse/</to>  <!-- THIS IS AJAX CASE  -->
         </mdn_extended_advancedstock_warehouse>

        <mdn_extended_advancedstock_stockmovement>
            <from><![CDATA[#^/AdvancedStock/StockMovement/#]]></from>
            <to>/mdn_extended/AdvancedStock_StockMovement/</to> <!-- this is page REFRESH CASE   -->
        </mdn_extended_advancedstock_stockmovement>
    </rewrite>
 </global>

现在我们在这里有一个有趣的问题。 在第一次重写的情况下,如果您对网格进行排序/过滤等任何操作。它发送和ajax调用。在正常情况下,如果会话消失,服务器返回拒绝的json,如下面的格式

{"ajaxExpired":1,"ajaxRedirect":"http:\/\/upgrade.magento.com\/index.php\/admin\/index\/login\/key\/90d3e0a32ecc2cb8e4183ecde51a0d54\/"}

但在第一种情况下,拒绝的json采用以下格式,网址已更改

{"ajaxExpired":1,"ajaxRedirect":"http:\/\/upgrade.magento.com\/index.php\/AdvancedStock\/index\/login\/key\/2e96b02d545ee3fddaea963ae6ec5d35\/"}

由于此用户转到404页面。

现在考虑第二次重写规则。

在这种情况下,如果会话超时,并且如果您在网格上执行任何操作,则会刷新页面,但不会转到登录页面,而是报告致命错误(尝试获取用户名) 经过几个小时的调试后,我们发现它是布局句柄的问题。

在正常情况下,如果路线名称为module/controller/action,则会加载magento 布局句柄 来自xml文件的<module_controller_action>也会加载<admin_index_login>

由于最终呈现<admin_index_login>。 在第二次重写的情况下,magento没有加载<admin_index_login>句柄,因此它显示致命错误。

我很欣赏这方面的任何暗示或帮助。如果您需要任何其他信息,我将很乐意为您提供。非常感谢你!

1 个答案:

答案 0 :(得分:2)

有点迟到但我们在另一个覆盖sales_order操作的模块上也遇到了这个问题。我们基本上通过覆盖我们的自定义控制器的构造来解决它:

protected function _construct() {
    Mage::getSingleton('core/session', array('name'=>'adminhtml'));
    if (!Mage::getSingleton('admin/session')->isLoggedIn()) {
        $this->_forward('adminhtml/index/login');
        return;
    } else {
       parent::_construct();
    }
}

虽然这解决了手头的问题,但核心问题似乎出现在Mage_Adminhtml_Controller_Action类,其中被拒绝的操作调用了$this->_redirect('*/index/login');,在您的情况下,它基本上会重定向到mdn_extended/index/login。这实际上可能会带来一些安全风险,所以我建议你总是像这样覆盖控制器,或者更改核心类重定向到adminhtml/index/login