Как я могу обнаружить AJAX-запрос внутри Drupal?


Ответы:


28

Для Drupal 7 в API нет ничего особенного, просто используйте простой PHP:

if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
  // AJAX request
}

Для Drupal 8 объект запроса Symfony имеет вспомогательный метод:

// Example for brevity only, inject the request_stack service and call 
// getCurrentRequest() on it to get the request object if possible.
$request = \Drupal::request();
$is_ajax = $request->isXmlHttpRequest();

Я пытаюсь проверить, поступил ли запрос с кнопки загрузки изображений. «HTTP_X_REQUESTED_WITH» не существует в массиве $ server. Есть идеи?
Mouneer

сэкономленные часы !! очень признателен !!
JayKandari

Спасибо, @Clive!
Aserww106

9

Вы можете рассмотреть использование current_path () в вашем хуке, для проверки, содержит ли путь слово ajax.

Пример:

$current_path = current_path();
if (strpos($current_path, 'ajax') !== false) {
    echo 'AJAX request detected!';
    exit;
}

3
Может работать на 95%, но, похоже, это не гарантировано. Во-первых, разве не принято, что строка «ajax» является частью пути для запросов ajax? Любой модуль contrib может зарегистрировать любой выбранный путь. Во-вторых, не может ли путь без AJAX содержать строку «AJAX»? Например, можно ли задать путь для страницы просмотра или панелей к myajaxpage?
Адамс

0

Поскольку не существует пуленепробиваемого метода проверки AJAX-запроса (как это HTTP_X_REQUESTED_WITHможет быть подделано), вот еще одна альтернатива, основанная на URL:

if (end((arg())) == 'ajax') {
  // AJAX request
}

Работает для представлений (в случае, когда последний элемент URI содержит слово «ajax»).

См. Также: Как проверить, является ли запрос AJAX-запросом с PHP?


Я думаю, что в случае файлов / ajax и media / ajax в URL могут быть дополнительные параметры, поэтому ajax не будет в конце. Например, / file / ajax / field_user_picture / und / 0 / form-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
AdamS

0

Запрос AJAX по работе с формами в Drupal будет означать, что форму необходимо перестроить. Чтобы обнаружить эту форму, необходимо восстановить:

$form_state['rebuild'] == TRUE;

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.