我目前正在开发一个Magento扩展程序,其主要组件是前端小部件和后端管理选项面板。我没有前端 Controller ,但是我的adminhtml
Controller 给我带来了一些麻烦。这是我 Controller 中的一些代码。
文件:/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/.../
之类的链接中导航而调用的操作。像这样的一些 Action ,例如index
,save
,edit
,grid
等。 Controller 的入口点是一个菜单项,它导致index
Action 。所有此类操作均按预期进行。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
方法中出现了问题。模块, Controller 和操作已成功解析,并且将请求标记为已调度(_dispatched
属性为true),直到调度controller_action_predispatch
事件为止。解决事件后,该请求显示为未调度(_dispatched
变为false)。大概是监听此事件的对象之一对请求进行了进一步处理,并拒绝了该请求。我还无法进行比这更深的调试。通常,我会发布一些代码来帮助您更好地了解正在发生的事情,但是要从各种配置文件和类中复制很多行,因此当人们写评论或回答要求查看特定文件时,我会这样做。到目前为止,我相信配置是正确的,因为除AJAX请求之外的所有其他功能都可以正常工作。
最佳答案
Url应该是http://mystore.com/index.php/admin/mybackend/ajax/key/.../?isAjax=true
,因此magento知道这是一个ajax请求。
另外,您还需要在POST数据中提供一个from_key,该数据存储在全局JavaScript变量window.FORM_KEY
中。
您的jQuery请求应如下所示:
function magentoAdminAjax(data, callback) {
data.form_key = window.FORM_KEY;
$.post(
'http://mystore.com/index.php/admin/mybackend/ajax/key/.../?isAjax=true',
data,
callback
);
}
可以在Mage_Adminhtml_Controller_Action::preDispatch(Line:164)(magento-1.7.0.2)中找到此检查的代码。
关于Magento adminhtml AJAX查询返回302状态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16320422/