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.
sollten Sie Verwenden Sie HTTPS? –
Ich verwende kein HTTPS (weder im Frontend noch im Backend). – Grampa