我目前正在开发一个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 ,例如indexsaveeditgrid等。 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/

10-14 16:03
查看更多