Ich entwickle gerade 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.
Datei: /app/code/community/Mynamespace/Myextension/controllers/Adminhtml/MybackendController.php
%Vor% normalAction
ist eine Aktion, die durch Navigieren durch Links wie http://mystore.com/index.php/admin/mybackend/normal/key/.../
aufgerufen wird. Es gibt ein paar Aktionen wie zum Beispiel index
, save
, edit
, grid
usw. Der Einstiegspunkt zu meinem Controller ist ein Menüeintrag, der zur Aktion index
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 versuche, ich eine 302 HTTP-Statuscodeantwort erhalte, die zum Admin-Dashboard ( admin/index/index
) 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".
Der Javascript / jQuery-Code, der die AJAX-Anfrage ausführt, ist nicht komplex:
%Vor%Beachten Sie, dass die Erfolgsfunktion aufgerufen wird, obwohl der Statuscode 302 ist.
Ich habe versucht, den Routing-Mechanismus zu debuggen, um genau zu verstehen, was ihn umleitet. Bisher habe ich abgeleitet, dass ein Problem in der Methode preDispatch
der Klasse Mage_Core_Controller_Varien_Action
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 Code, um besser zu verstehen, was hier vor sich geht, 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 Siehe bestimmte Dateien. Bisher glaube ich, dass die Konfiguration korrekt ist, da alle anderen Funktionen außer der AJAX-Anfrage in Ordnung sind.
Die URL sollte http://mystore.com/index.php/admin/mybackend/ajax/key/.../?isAjax=true
sein, also weiß Magento, dass dies eine Ajax-Anfrage ist.
Sie müssen auch einen from_key in Ihren POST-Daten angeben, der in der globalen JavaScript-Variable window.FORM_KEY
gespeichert ist.
Ihre jQuery-Anfrage sollte etwa so aussehen:
%Vor%Der Code für diese Überprüfung befindet sich in Mage_Adminhtml_Controller_Action :: preDispatch (Zeile: 164) (magento-1.7.0.2)
Tags und Links magento magento-1.7