Bagaimana saya bisa mendeteksi permintaan AJAX di dalam Drupal?

18

Saya mencari cara Drupal mendeteksi permintaan AJAX. Saya perlu memeriksa ini di dalam hook_form_alter (menyematkan tampilan dengan dukungan AJAX)

Natrium
sumber
Ini mungkin membantu: drupal.stackexchange.com/questions/86939/…
shasi kanth

Jawaban:

28

Untuk Drupal 7 tidak ada yang istimewa di API, cukup gunakan PHP biasa:

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

Untuk Drupal 8, objek permintaan Symfony memiliki metode pembantu:

// 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
sumber
Saya mencoba memeriksa apakah permintaan datang dari tombol unggah gambar. 'HTTP_X_REQUESTED_WITH' tidak ada di $ array server. Ada Ide?
Mouneer
menghemat waktu !! sangat dihargai !!
JayKandari
Terima kasih, @Clive!
aserww106
9

Anda dapat mempertimbangkan menggunakan current_path () di hook Anda, untuk memeriksa apakah path berisi kata 'ajax' di dalamnya.

Ex:

$current_path = current_path();
if (strpos($current_path, 'ajax') !== false) {
    echo 'AJAX request detected!';
    exit;
}
shasi kanth
sumber
3
Mungkin bekerja 95% tetapi sepertinya ini tidak dijamin. Pertama bukan hanya konvensi bahwa string 'ajax' adalah bagian dari path untuk permintaan ajax? Modul contrib dapat mendaftarkan jalur apa pun yang dipilihnya. Kedua, bisakah jalur non-ajax berisi string 'ajax'? Misalnya, dapat menetapkan jalur untuk halaman tampilan atau panel ke 'myajaxpage'?
AdamS
0

Karena tidak ada metode anti peluru untuk memeriksa permintaan AJAX (seperti HTTP_X_REQUESTED_WITHdapat dipalsukan), berikut adalah alternatif lain berdasarkan URL:

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

Bekerja untuk tampilan (jika item URI terakhir berisi kata 'ajax').

Lihat juga: Bagaimana memeriksa apakah permintaan tersebut adalah permintaan AJAX dengan PHP?

kenorb
sumber
Saya pikir dalam kasus file / ajax dan media / ajax kemungkinan ada parameter tambahan pada URL, jadi ajax tidak akan berada di akhir. Misalnya / file / ajax / field_user_picture / und / 0 / form-XXXXXXXXXXXXXXXXXXXXXXXXXXX
AdamS
0

Permintaan AJAX dalam lingkup bekerja dengan formulir di Drupal berarti formulir itu harus dibangun kembali. Untuk mendeteksi formulir yang harus dibangun kembali, seseorang harus memeriksa:

$form_state['rebuild'] == TRUE;
Kirill Roskolii
sumber
0

Bagaimana saya melakukannya menggunakan:

$request = $_SERVER['REQUEST_URI']

Di sana saya mendeteksi? _Wrapper_format = drupal_ajax

Stef Van Looveren
sumber