我目前正在开发一个 Magento 扩展,其主要组件是前端小部件和后端管理选项面板。我没有前端控制器,但我有一个adminhtml
控制器给我带来了一些麻烦。这是我的控制器中的一些代码。
文件:/app/code/community/Mynamespace/Myextension/controllers/Adminhtml/MybackendController.php
class Mynamespace_Myextension_Adminhtml_MybackendController
extends Mage_adminhtml_Controller_Action
{
protected function normalAction() {
}
protected function ajaxAction() {
die('got here');
}
}
normalAction
是通过导航链接调用的操作,例如http://mystore.com/index.php/admin/mybackend/normal/key/.../
. 有一些类似的操作,例如index
, save
, edit
,grid
等。我的控制器的入口点是一个菜单项,它会导致index
操作。所有此类操作都按预期工作。
ajaxAction
是仅通过 AJAX POST 查询调用的操作。
问题是每当我尝试这样做时,我都会收到一个 302 HTTP 状态代码回复,该回复重定向到管理仪表板( admin/index/index
)。如果我尝试通过在浏览器中键入其链接直接访问此操作,我仍然会收到 302。如果我向此操作添加一个菜单条目,那么它会按预期工作,并且我会看到“到达这里”文本。
执行 AJAX 请求的 Javascript/jQuery 代码并不复杂:
$.post(
'http://mystore.com/index.php/admin/mybackend/ajax/key/.../',
somePostDataObject,
function() {
alert( 'success' );
}
);
请注意,即使状态码为 302,也会调用成功函数。
我尝试调试路由机制以准确了解导致它重定向的原因。到目前为止,我已经推断出类的preDispatch
方法出现了问题Mage_Core_Controller_Varien_Action
。模块、控制器和操作成功解析,请求被标记为已调度(_dispatched
属性为 true),直到controller_action_predispatch
事件被调度。事件解决后,请求显示为未分派(_dispatched
变为 false)。据推测,侦听此事件的对象之一对请求进行了进一步处理并拒绝了它。我无法进行比这更深入的调试。
通常我会发布一些代码来帮助您更好地了解发生了什么,但是从各种配置文件和类中复制了很多行,所以当人们写评论或回答要求查看特定文件时,我会这样做. 到目前为止,我认为配置是正确的,因为除了 AJAX 请求之外的所有其他功能都可以正常工作。