8

我目前正在开发一个 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 请求之外的所有其他功能都可以正常工作。

4

1 回答 1

27

Url 应该是http://mystore.com/index.php/admin/mybackend/ajax/key/.../?isAjax=true,所以 magento 知道这是一个 ajax 请求。

您还需要在存储在全局 JavaScript 变量中的 POST 数据中提供 from_key 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) 中找到

于 2013-06-05T08:28:36.110 回答