我目前正在开发一个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
等。我的控制器的入口点是一个菜单项,指向{ {1}}行动。所有这些行动都按预期进行。
index
是仅通过AJAX POST查询调用的操作。
问题是每当我尝试这样做时,我都会得到一个302 HTTP状态代码回复,重定向到管理仪表板(ajaxAction
)。如果我尝试通过在浏览器中键入其链接来直接访问此操作,我仍然会得到302.如果我向此操作添加一个菜单项,那么它按预期工作,我看到“到达此处”文本。
执行AJAX请求的Javascript / jQuery代码并不复杂:
admin/index/index
请注意,即使状态代码为302,也会调用success函数。
我尝试调试路由机制以准确了解导致其重定向的原因。到目前为止,我已经推断出$.post(
'http://mystore.com/index.php/admin/mybackend/ajax/key/.../',
somePostDataObject,
function() {
alert( 'success' );
}
);
类的preDispatch
方法中出现了问题。成功解析模块,控制器和操作,并将请求标记为已调度(Mage_Core_Controller_Varien_Action
属性为true),直到调度_dispatched
事件为止。事件解决后,请求显示为未分派(controller_action_predispatch
变为false)。据推测,监听此事件的对象之一会对请求进行一些进一步处理并拒绝它。我无法进行更深入的调试。
通常我会发布一些代码来帮助你理解更好的内容,但是有很多行可以从各种配置文件和类中复制,所以我会这样做,因为人们写评论或答案要求看特定文件。到目前为止,我认为配置是正确的,因为除了AJAX请求之外的所有其他功能都可以正常工作。
答案 0 :(得分:25)
网址应为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(行:164)(magento-1.7.0.2)中找到