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

18

Я ищу Drupal способ обнаружения AJAX-запроса. Мне нужно проверить это внутри hook_form_alter (встраивание представлений с поддержкой AJAX)

Codium
источник
Это может помочь: drupal.stackexchange.com/questions/86939/…
Шаси Кант

Ответы:

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?

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

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

$form_state['rebuild'] == TRUE;
Кирилл Росколий
источник
0

Как я это сделал, использовал:

$request = $_SERVER['REQUEST_URI']

Там я обнаружил? _Wrapper_format = drupal_ajax

Стеф Ван Луверен
источник