如何在Drupal中检测AJAX请求?


Answers:


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

我正在尝试检查请求是否来自图片上传按钮。$ server数组中不存在'HTTP_X_REQUESTED_WITH'。有任何想法吗?
Mouneer 2015年

节省时间!非常感激 !!
JayKandari'5

谢谢@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”字)。

另请参阅:如何使用PHP检查请求是否为AJAX请求?


我认为在文件/ ajax和媒体/ ajax的URL上可能会有额外的参数,因此ajax不会在结尾。例如/ file / ajax / field_user_picture / und / 0 / form-XXXXXXXXXXXXXXXXXXXXXXXXXX
AdamS 2015年


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.