2013-05-01 11 views
7

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.

+0

należy korzystać z HTTPS? –

+0

W ogóle nie używam HTTPS (ani na frontend, ani na zapleczu). – Grampa

Odpowiedz

25

Adres URL powinien być http://mystore.com/index.php/admin/mybackend/ajax/key/.../?isAjax=true, więc magento wie, że jest to żądanie ajax.

Należy również podać wartość from_key w danych POST przechowywanych w globalnej zmiennej JavaScript window.FORM_KEY.

Twój jQuery Żądanie powinno wyglądać mniej więcej tak:

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

Kodeks tej kontroli można znaleźć w Mage_Adminhtml_Controller_Action :: preDispatch (line: 164) (magento-1.7.0.2)

+0

Dziękuję za odpowiedź i przepraszam za tak długi czas, aby to zaakceptować - w międzyczasie musiałem pracować nad innym projektem. Brakowało 'isAjax = true' w moich żądaniach. To dlatego nie działa. Jednak zamiast dodawać parametr do żądania jQuery, zdecydowałem się przejść z żądaniami typu Prototype, które normalnie używa Magento: 'Ajax.Request'. Automatycznie dodaje również "isAjax". Może się wydawać, że mieszanie jQuery z prototypem jest niewłaściwe, ale i tak potrzebuję prototypu do interfejsu z różnymi widżetami Magento (siatki, selektory obrazów itp.), Więc wszystko w końcu działa. – Grampa

+0

Dzięki, to był problem, który miałem także. Najwyraźniej możesz tworzyć żądania ajax GET bez klucza formularza, ale gdy tylko użyjesz POST, rozpocznie się przekierowanie do pulpitu bez niego. –

Powiązane problemy