2013-05-01 9 views
7

Ich entwickle derzeit eine Magento-Erweiterung, deren Hauptkomponenten ein Frontend-Widget und ein Backend-Admin-Optionsfeld sind. Ich habe keinen Frontend-Controller, aber ich habe einen adminhtml Controller, der mir einige Probleme bereitet. Hier ist ein Teil des Codes in meinem Controller.Magento adminhtml AJAX-Abfrage gibt 302 Status zurück

Datei: /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 ist eine Aktion, die durch die Navigation durch Links wie http://mystore.com/index.php/admin/mybackend/normal/key/.../ genannt wird. Es gibt ein paar Aktionen wie diese wie index, save, edit, grid usw. Der Einstieg in meinen Controller ist ein Menü-Eintrag, der auf die index Aktion führt. Alle diese Aktionen funktionieren wie erwartet.

ajaxAction ist eine Aktion, die nur über eine AJAX-POST-Abfrage aufgerufen wird.

Das Problem ist, dass, wenn ich dies zu tun versuchen, bekomme ich eine 302 HTTP-Statuscode Antwort, die (admin/index/index) an den Admin-Dashboard umleitet. Wenn ich versuche, direkt auf diese Aktion zuzugreifen, indem ich den Link im Browser eintippe, bekomme ich immer noch eine 302. Wenn ich dieser Aktion einen Menüeintrag hinzufüge, dann funktioniert es wie erwartet und ich sehe den Text "get here".

Die Javascript/jQuery-Code, der die AJAX-Request tut, ist nicht kompliziert:

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

Beachten Sie, dass die Erfolgsfunktion, obwohl die ich den Mechanismus Routing Debuggen versucht

302 Statuscode aufgerufen wird genau zu verstehen, was bewirkt, dass es umgeleitet wird. Bisher habe ich abgeleitet, dass ein Problem in der preDispatch Methode der Mage_Core_Controller_Varien_Action Klasse auftritt. Das Modul, der Controller und die Aktion werden erfolgreich aufgelöst, und die Anforderung wird als erledigt gekennzeichnet (_dispatched Eigenschaft ist wahr), bis das Ereignis controller_action_predispatch ausgelöst wird. Nachdem das Ereignis behoben wurde, wird die Anforderung als nicht gesendet angezeigt (_dispatched wird falsch). Vermutlich führt eines der Objekte, die auf dieses Ereignis warten, eine weitere Bearbeitung der Anfrage durch und weist sie zurück. Ich konnte nicht tiefer als das debuggen. Normalerweise poste ich etwas Code, um zu verstehen, was noch besser läuft, aber es gibt ziemlich viele Zeilen, die aus den verschiedenen Konfigurationsdateien und Klassen kopiert werden müssen, also werde ich das tun, wenn Leute Kommentare oder Antworten schreiben um bestimmte Dateien zu sehen. Bisher glaube ich, dass die Konfiguration korrekt ist, da alle anderen Funktionen neben der AJAX-Anfrage in Ordnung sind.

+0

sollten Sie Verwenden Sie HTTPS? –

+0

Ich verwende kein HTTPS (weder im Frontend noch im Backend). – Grampa

Antwort

25

Die URL sollte http://mystore.com/index.php/admin/mybackend/ajax/key/.../?isAjax=true sein, also Magento weiß, dass dies eine Ajax-Anfrage ist.

Auch benötigen Sie einen from_key in Ihren POST-Daten zu schaffen, die in dem globalen JavaScript Variable window.FORM_KEY gespeichert ist.

Ihre jQuery Antrag sollte wie folgt aussehen:

function magentoAdminAjax(data, callback) { 
    data.form_key = window.FORM_KEY; 
    $.post(
     'http://mystore.com/index.php/admin/mybackend/ajax/key/.../?isAjax=true', 
     data, 
     callback 
    ); 
} 

Der Code für diese Prüfung kann in Mage_Adminhtml_Controller_Action :: preDispatch (Linie 164) zu finden (magento-1.7.0.2)

+0

Vielen Dank für Ihre Antwort und ich entschuldige mich dafür, dass ich so lange gebraucht habe, um sie zu akzeptieren - ich musste in der Zwischenzeit an einem anderen Projekt arbeiten. Ich habe 'isAjax = true' in meinen Anfragen vermisst. Deshalb hat es nicht funktioniert. Anstatt jedoch den Parameter zur jQuery-Anfrage hinzuzufügen, entschied ich mich, die Anforderungen von Prototype-style zu verwenden, die Magento normalerweise verwendet: 'Ajax.Request'. Es wird automatisch 'isAjax' hinzugefügt. Es mag falsch erscheinen, jQuery und Prototype zu mischen, aber ich brauche sowieso Prototype, um mit den verschiedenen Magento-Widgets zu interagieren (Gitter, Bildwähler usw.). Am Ende funktioniert alles :) – Grampa

+0

Danke, das war das Problem, das ich hatte auch. Anscheinend können Sie Ajax GET-Anfragen ohne den Formularschlüssel machen, aber sobald Sie POST verwenden, beginnt es ohne es auf das Dashboard umzuleiten. –