Comment puis-je détecter une demande AJAX dans Drupal?

18

Je cherche un moyen Drupal de détecter une requête AJAX. Je dois vérifier cela à l'intérieur de hook_form_alter (intégration des vues avec le support AJAX)

Codium
la source
Cela pourrait aider: drupal.stackexchange.com/questions/86939/…
shasi kanth

Réponses:

28

Pour Drupal 7, il n'y a rien de spécial dans l'API, utilisez simplement du PHP simple:

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

Pour Drupal 8, l'objet de demande Symfony a une méthode d'assistance:

// 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
la source
J'essaie de vérifier si la demande provient du bouton de téléchargement d'image. 'HTTP_X_REQUESTED_WITH' n'existe pas dans le tableau $ server. Des idées?
Mouneer
des heures gagnées !! très appréciée !!
JayKandari
Merci, @Clive!
aserww106
9

Vous pouvez envisager d'utiliser current_path () dans votre hook, pour vérifier si le chemin contient le mot «ajax».

Ex:

$current_path = current_path();
if (strpos($current_path, 'ajax') !== false) {
    echo 'AJAX request detected!';
    exit;
}
shasi kanth
la source
3
Peut fonctionner à 95%, mais il semble que ce ne soit pas garanti. Premièrement, n'est-ce pas la seule convention selon laquelle la chaîne «ajax» fait partie du chemin d'accès aux requêtes ajax? N'importe quel module contrib pourrait enregistrer n'importe quel chemin qu'il choisit. Deuxièmement, un chemin non ajax ne pouvait-il pas contenir la chaîne «ajax»? Par exemple, pourrait-il définir le chemin d'une page de vue ou de panneaux sur «myajaxpage»?
AdamS
0

Puisqu'il n'y a pas de méthode à l'épreuve des balles pour vérifier la demande AJAX (comme cela HTTP_X_REQUESTED_WITHpeut être usurpé), voici une autre alternative basée sur l'URL:

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

Fonctionne pour les vues (dans le cas où le dernier élément URI contient un mot «ajax»).

Voir aussi: Comment vérifier si la requête est une requête AJAX avec PHP?

kenorb
la source
Je pense que dans le cas de file / ajax et media / ajax, il y aura probablement des paramètres supplémentaires sur l'URL, donc ajax ne sera pas à la fin. Par exemple / fichier / ajax / field_user_picture / und / 0 / form-XXXXXXXXXXXXXXXXXXXXXXXXXX
AdamS
0

La demande AJAX dans le cadre de l'utilisation de formulaires dans Drupal signifierait que le formulaire doit être reconstruit. Pour détecter que le formulaire doit être reconstruit, il faut vérifier:

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

Comment je l'ai fait en utilisant:

$request = $_SERVER['REQUEST_URI']

Là, j'ai détecté le? _Wrapper_format = drupal_ajax

Stef Van Looveren
la source