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、このようなアクションがいくつかあります。コントローラーへのエントリ ポイントは、アクションにつながるメニュー エントリです。このようなアクションはすべて期待どおりに機能します。saveeditgridindex

ajaxActionは、AJAX POST クエリを介してのみ呼び出されるアクションです。

問題は、これを実行しようとすると、管理ダッシュボードにリダイレクトされる 302 HTTP ステータス コード応答が返されることです( admin/index/index)。ブラウザーにリンクを入力してこのアクションに直接アクセスしようとすると、302 が返されます。このアクションにメニュー エントリを追加すると、期待どおりに動作し、"got here" というテキストが表示されます。

AJAX 要求を実行する Javascript/jQuery コードは複雑ではありません。

$.post(
    'http://mystore.com/index.php/admin/mybackend/ajax/key/.../',
    somePostDataObject,
    function() {
        alert( 'success' );
    }
);

ステータス コードが 302 であっても、success 関数が呼び出されることに注意してください。

リダイレクトの原因を正確に理解するために、ルーティング メカニズムをデバッグしてみました。これまでのところ、クラスのpreDispatchメソッドで問題が発生していると推測しました。Mage_Core_Controller_Varien_Actionモジュール、コントローラー、およびアクションが正常に解決され、イベントがディスパッチさ_dispatchedれるまで、リクエストはディスパッチ済み (プロパティが true)としてマークされます。controller_action_predispatchイベントが解決された後、リクエストはディスパッチされていないように見えます ( _dispatchedfalse になります)。おそらく、このイベントをリッスンするオブジェクトの 1 つが、リクエストに対してさらに処理を行い、それを拒否します。これよりも深くデバッグすることはできませんでした。

通常、何が起こっているのかをよりよく理解するのに役立つコードを投稿しますが、さまざまな構成ファイルとクラスからコピーする行がかなりあるため、特定のファイルを表示するように求めるコメントや回答を書くときにそれを行います. これまでのところ、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 に答える