2011-01-11 4 views
10

Мне нужно проверить, является ли запрос ajax. $request->isXmlHttpRequest() работает нормально, однако, если в ходе выполнения есть перенаправление, этот метод возвращает false. Как еще я могу проверить, является ли запрос ajax в этом случае? стр. ajax инициируется jQuery

ответ

8

Если вы перенаправляете arent на другое приложение в своем проекте или на другой внешний uri, просто используйте forward, если isXmlHttpRequest истинно при первом запросе.


Ну что метод проверяет против значения заголовка X-Requested-with и в некоторых реализациях браузера, что заголовок (или все оригинальные заголовки) отбрасываются/перезаписаны из перенаправлены запроса (FF назвать одну).

В качестве обходного пути вы можете использовать переменную в самом запросе. Возможно, вы сможете использовать существующую инфраструктуру sf_format, но я не уверен, что это сработает, потому что я не знаком с тем, как она работает внутри страны.

+0

именно, Firefox виноват. Протестировано то же самое в Opera, отлично работает. – Dziamid

+0

@Dziamid: Да, есть ошибка, но ее пропустили выпуск FF4, так что он будет как минимум 4.1 до его исправления. Кроме того, могут быть и другие браузеры, где это происходит, хотя им не известно ни о каких других вещах. Поэтому я буду играть в нее консервативно с вашим обходом. На самом деле, если возможно, я могу удалить перенаправление из уравнения все вместе, если это возможно. – prodigitalson

+0

Я запрещаю себе голову, но безрезультатно. Очевидно, что установка настраиваемого параметра запроса для объекта запроса не помогает - они понятны при перенаправлении. Использование sf_format является сложным способом (потому что symfony будет искать разные шаблоны, такие как indexSuccess.sf_format.php). – Dziamid

2

Если вам нужен простой обходной путь, я хотел бы предложить

Используйте URL, как http://mywebsite.com/loadsomething.php?ajax=true и

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

Или, если вы публикуете вы можете создать скрытое поле с именем «Аякса». Конечно, это не решит вашу проблему навсегда, но будет работать быстро, если вам это нужно как можно скорее.

Если вы хотите поддерживать только одну переадресацию, вы также можете создать переменную вспышки.

В противном случае вы можете посмотреть на исходный код Symfony:

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

В строке 518 вы можете увидеть объект запроса идентифицирует запрос, чтобы быть Аякса из заголовков HTTP. Поэтому вам нужно выяснить, что после перенаправления, почему одни и те же заголовки HTTP установлены неправильно.

+0

, потому что они очищаются определенными браузерами, как @prodigitalson (см. Другой ответ). Проблема не имеет ничего общего с Symfony. – Dziamid

+0

Нет, я не говорил, что это имеет какое-то отношение к Symfony. Я только сказал, где я начну преследовать проблему. – Aston

6

Некоторые библиотеки JS не передает значение XmlHttpRequest в заголовках, Жюст добавить это в вашем скрипте:

xhr.setRequestHeader("X-Requested-With","XMLHttpRequest"); 
Смежные вопросы