我们已经为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>
句柄,因此它显示致命错误。
我很欣赏这方面的任何暗示或帮助。如果您需要任何其他信息,我将很乐意为您提供。非常感谢你!
答案 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
。