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


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();

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;
}

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?


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;

0

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

$request = $_SERVER['REQUEST_URI']

Tam wykryłem? _Wrapper_format = drupal_ajax

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.