2011-01-11 7 views
10

Devo verificare se la richiesta è ajax. $request->isXmlHttpRequest() funziona correttamente, tuttavia se c'è un reindirizzamento da qualche parte durante l'esecuzione, questo metodo restituirà false. In quale altro modo posso verificare se la richiesta è ajax in questo caso? p.s. ajax è avviato da jQuery

risposta

8

Se non si sta reindirizzando a un'altra applicazione nel progetto o un altro uri esterno, utilizzare invece forward se isXmlHttpRequest è true alla prima richiesta.


bene che metodo controlla contro il valore dell'intestazione X-Requested-with e in alcune implementazioni browser che intestazione (o tutte le intestazioni originali) sono caduto/sovrascritto dalla richiesta reindirizzata (FF per citarne uno).

Come soluzione alternativa è possibile utilizzare una variabile nella richiesta stessa. Potresti essere in grado di utilizzare l'infrastruttura sf_format esistente, ma non sono sicuro che ciò funzionerebbe perché non ho familiarità con il suo funzionamento interno.

+0

Esattamente, Firefox è la colpa. Testato lo stesso in Opera, funziona bene. – Dziamid

+0

@Dziamid: Sì, c'è un bug archiviato ma è mancato il rilascio di FF4, quindi sarà almeno il 4.1 prima che sia corretto. Inoltre, ci possono essere altri browser in cui questo accade anche se non sono a conoscenza di altri a portata di mano. Quindi giocherei conservativo con la tua soluzione alternativa. In realtà se possibile potrei rimuovere il reindirizzamento dall'equazione tutti insieme se possibile. – prodigitalson

+0

Sto mettendo al bando la mia testa contro di esso, ma senza successo. Ovviamente, l'impostazione di un parametro di richiesta personalizzato su un oggetto di richiesta non aiuta - sono chiari su un reindirizzamento. Usare sf_format è un modo complicato (perché symfony cercherà quindi modelli diversi, come indexSuccess.sf_format.php). – Dziamid

2

Se avete bisogno di una soluzione semplice, vorrei suggerire

utilizzare un URL come http://mywebsite.com/loadsomething.php?ajax=true e

$isAjax = $request->getParameter('ajax'); 

Oppure, se stai scrivendo è possibile creare un campo nascosto denominato "Ajax". Naturalmente questi non risolveranno il tuo problema per sempre, ma funzioneranno come soluzione rapida se ne hai bisogno il prima possibile.

Se si desidera supportare solo un reindirizzamento, è possibile creare anche una variabile flash.

In caso contrario si può guardare il codice sorgente di symfony:

http://trac.symfony-project.org/browser/branches/1.4/lib/request/sfWebRequest.class.php 

on line 518 è possibile vedere l'oggetto della richiesta identifica la richiesta di essere ajax dalle intestazioni HTTP. Quindi devi scoprire che dopo il reindirizzamento perché le stesse intestazioni HTTP non sono impostate correttamente.

+0

perché vengono cancellati dai browser di sicurezza, come @prodigitalson (vedere un'altra risposta). Il problema non ha nulla a che fare con Symfony. – Dziamid

+0

No, non ho detto che ha qualcosa a che fare con Symfony. Ho solo detto dove avrei iniziato a rincorrere il problema. – Aston

6

Alcune librerie js non invia il valore XmlHttpRequest nelle intestazioni, juste aggiungere questo nello script:

xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");