Obecnie rozwijam rozszerzenie Magento, którego głównymi komponentami są widget frontendu i panel opcji administracyjnych zaplecza. Nie mam kontrolera frontend, ale mam kontroler adminhtml
, który sprawia mi kłopot. Oto niektóre z kodu w moim kontrolerze.Magento adminhtml Zapytanie AJAX zwraca status 302
Plik: /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
to akcja, która jest wywoływana przez nawigowanie za pomocą linków, takich jak http://mystore.com/index.php/admin/mybackend/normal/key/.../
. Jest kilka takich działań, jak np. index
, save
, edit
, grid
itd. Punkt wejścia do kontrolera to pozycja menu, która prowadzi do działania index
. Wszystkie takie działania działają zgodnie z oczekiwaniami.
ajaxAction
to akcja, która jest wywoływana tylko przez kwerendę POST AJAX.
Problem polega na tym, że gdy próbuję to zrobić, pojawia się stanu 302 HTTP odpowiedzi kod, który przekierowuje do panelu admina (admin/index/index
). Jeśli spróbuję uzyskać dostęp do tej akcji bezpośrednio, wpisując jej link w przeglądarce, nadal otrzymuję numer 302. Jeśli dodaję wpis menu do tej akcji, to działa zgodnie z oczekiwaniami i widzę tekst "tu".
kodu JavaScript/jQuery, że robi żądania AJAX nie jest skomplikowana:
$.post(
'http://mystore.com/index.php/admin/mybackend/ajax/key/.../',
somePostDataObject,
function() {
alert('success');
}
);
pamiętać, że funkcja jest wywoływana sukces, mimo że kod stanu jest 302.
Próbowałem debugowania mechanizm routingu aby dokładnie zrozumieć, co powoduje przekierowanie. Do tej pory wydedukowałem, że problem występuje w metodzie preDispatch
klasy Mage_Core_Controller_Varien_Action
. Moduł, kontroler i akcja zostały pomyślnie rozstrzygnięte, a żądanie jest oznaczone jako wysłane (właściwość _dispatched
jest prawdziwa) do momentu wywołania zdarzenia controller_action_predispatch
. Po rozstrzygnięciu zdarzenia żądanie pojawia się jako nieprzesyłane (_dispatched
staje się fałszywe). Prawdopodobnie jeden z obiektów, które nasłuchują tego zdarzenia, przetwarza dalej na żądanie i odrzuca go. Nie byłem w stanie debugować głębiej niż to.
Normalnie chciałbym opublikować kod, który pomoże ci zrozumieć, co się dzieje jeszcze lepiej, ale jest sporo linii do skopiowania z różnych plików konfiguracyjnych i klas, więc zrobię to, gdy ludzie piszą komentarze lub odpowiedzi z pytaniem aby zobaczyć określone pliki. Do tej pory uważam, że konfiguracja jest poprawna, ponieważ wszystkie inne funkcje poza żądaniem AJAX działają poprawnie.
należy korzystać z HTTPS? –
W ogóle nie używam HTTPS (ani na frontend, ani na zapleczu). – Grampa