2013-05-01 10 views
7

Attualmente sto sviluppando un'estensione Magento i cui componenti principali sono un widget di frontend e un pannello di opzioni di amministrazione di back-end. Non ho controller frontend, ma ho un controller adminhtml che mi sta dando dei problemi. Ecco parte del codice nel mio controller.Magento adminhtml La query AJAX restituisce lo stato 302

File: /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 è un'azione che viene chiamato navigando tramite link, come http://mystore.com/index.php/admin/mybackend/normal/key/.../. Ci sono alcune azioni come questa come index, save, edit, grid, ecc. Il punto di accesso al mio controller è una voce di menu che conduce all'azione index. Tutte queste azioni funzionano come previsto.

ajaxAction è un'azione che viene chiamata solo tramite una query POST AJAX.

Il problema è che ogni volta che tento di fare questo, ottengo una risposta codice di stato HTTP 302 che reindirizza l'amministratore cruscotto (admin/index/index). Se provo ad accedere direttamente a questa azione digitando il suo collegamento nel browser, ottengo ancora un 302. Se aggiungo una voce di menu a questa azione, allora funziona come previsto e vedo il testo "ottenuto qui".

Il codice JavaScript/jQuery che fa la richiesta AJAX non è complesso:

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

Nota che la funzione di successo viene chiamata anche se il codice di stato è 302.

ho provato il debug del meccanismo di routing per capire esattamente cosa causa il reindirizzamento. Finora ho dedotto che si verifica un problema nel metodo preDispatch della classe Mage_Core_Controller_Varien_Action. Il modulo, il controller e l'azione sono stati risolti correttamente e la richiesta è contrassegnata come spedita (la proprietà _dispatched è vera) finché non viene inviato l'evento controller_action_predispatch. Dopo che l'evento è stato risolto, la richiesta appare come non inviata (_dispatched diventa falso). Presumibilmente uno degli oggetti che ascoltano questo evento esegue qualche ulteriore elaborazione sulla richiesta e la rifiuta. Non sono stato in grado di eseguire il debug di qualsiasi livello più profondo di questo.

Normalmente inserirò del codice per aiutarti a capire cosa sta succedendo ancora meglio, ma ci sono un sacco di righe da copiare dai vari file e classi di configurazione, quindi lo farò mentre le persone scrivono commenti o risposte chiedendo per vedere file specifici. Finora, credo che la configurazione sia corretta, poiché tutte le altre funzionalità oltre alla richiesta AJAX funzionano correttamente.

+0

si dovrebbe usare HTTPS? –

+0

Non sto usando affatto HTTPS (né sul frontend né sul backend). – Grampa

risposta

25

L'URL deve essere http://mystore.com/index.php/admin/mybackend/ajax/key/.../?isAjax=true, quindi Magento sa che si tratta di una richiesta Ajax.

Inoltre è necessario fornire un da_key nei dati POST che è archiviato nella variabile JavaScript globale window.FORM_KEY.

tuo jQuery richiesta deve essere simile a questa:

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

Il codice per questa prova può essere trovato in Mage_Adminhtml_Controller_Action :: preDispatch (Linea: 164) (Magento-1.7.0.2)

+0

Grazie per la risposta e mi scuso per aver impiegato così tanto tempo ad accettarlo - nel frattempo ho dovuto lavorare su un altro progetto. Mi mancava 'isAjax = true' nelle mie richieste. Questo è il motivo per cui non funzionava. Tuttavia, invece di aggiungere il parametro alla richiesta jQuery, ho deciso di utilizzare le richieste in stile Prototype che Magento normalmente utilizza:'Ajax.Request'. Aggiunge automaticamente anche 'isAjax'. Potrebbe sembrare sbagliato combinare jQuery e Prototype, ma ho comunque bisogno di Prototype per interfacciarmi con i vari widget di Magento (griglie, selettori di immagini, ecc.) Quindi alla fine tutto funziona :) – Grampa

+0

Grazie, questo era il problema che avevo anche. Apparentemente è possibile effettuare richieste GET ajax senza la chiave del modulo, ma non appena si utilizza POST si inizia il reindirizzamento al dashboard senza di esso. –

Problemi correlati