Jak mogę wykryć żądanie AJAX w Drupal?

18

Szukam sposobu Drupala na wykrycie żądania AJAX. Muszę to sprawdzić wewnątrz hook_form_alter (osadzanie widoków z obsługą AJAX)

Codium
źródło
To może pomóc: drupal.stackexchange.com/questions/86939/…
shasi kanth

Odpowiedzi:

28

W Drupal 7 nie ma nic specjalnego w API, wystarczy użyć zwykłego PHP:

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

W przypadku Drupala 8 obiekt żądania Symfony ma metodę pomocniczą:

// 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();
Clive
źródło
Próbuję sprawdzić, czy żądanie pochodzi z przycisku przesyłania obrazu. „HTTP_X_REQUESTED_WITH” nie istnieje w tablicy $ server server. Jakieś pomysły?
Mouneer,
zaoszczędzone godziny !! bardzo mile widziane !!
JayKandari
Dzięki, @Clive!
aserww106
9

Możesz rozważyć użycie metody current_path () w haku, aby sprawdzić, czy ścieżka zawiera słowo „ajax”.

Dawny:

$current_path = current_path();
if (strpos($current_path, 'ajax') !== false) {
    echo 'AJAX request detected!';
    exit;
}
shasi kanth
źródło
3
Może pracować w 95%, ale wygląda na to, że nie jest to gwarantowane. Po pierwsze, czy nie jest to tylko konwencja, że ​​ciąg „ajax” jest częścią ścieżki dla żądań ajax? Każdy moduł contrib może zarejestrować dowolną ścieżkę, którą wybierze. Po drugie, czy ścieżka inna niż ajax nie może zawierać ciągu „ajax”? Np. Czy można ustawić ścieżkę strony widoku lub paneli na „myajaxpage”?
AdamS
0

Ponieważ nie ma kuloodpornej metody sprawdzania żądania AJAX (co HTTP_X_REQUESTED_WITHmożna sfałszować), oto inna alternatywa oparta na adresie URL:

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

Działa dla widoków (w przypadku, gdy ostatni element URI zawiera słowo „ajax”).

Zobacz także: Jak sprawdzić, czy żądanie jest żądaniem AJAX w PHP?

kenorb
źródło
Myślę, że w przypadku pliku / ajax i media / ajax prawdopodobnie będą dodatkowe parametry w adresie URL, więc ajax nie będzie na końcu. Np. / File / ajax / field_user_picture / und / 0 / form-XXXXXXXXXXXXXXXXXXXXXXXXXX
AdamS
0

Żądanie AJAX w zakresie pracy z formularzami w Drupal oznaczałoby, że formularz musi zostać odbudowany. Aby wykryć, że formularz musi zostać odbudowany, należy sprawdzić:

$form_state['rebuild'] == TRUE;
Kirill Roskolii
źródło
0

Jak to zrobiłem, użyłem:

$request = $_SERVER['REQUEST_URI']

Tam wykryłem? _Wrapper_format = drupal_ajax

Stef Van Looveren
źródło