如何使我的 CodeIgniter 控制器能够正确识别来自 FullCalendar4 的 ajax 调用?

How to enable my CodeIgniter controller to correctly identify ajax calls from FullCalendar4?

我正在使用 FullCalendar 4.4.0 和我正在开发的 CodeIgniter 应用程序。

在我项目的许多地方,我成功地使用了 CI 的 $this->input->is_ajax_request() 方法来确定我的控制器是否被 ajax 请求加载。

问题是,当我使用 FullCalendar's single-source events option 并传递 POST 请求时,is_ajax_request() 调用未将调​​用识别为来自 ajax。

如何使我的控制器能够正确识别 ajax 个呼叫?

从 FullCalendar 版本 3 到版本 4 的 major breaking changes 之一是

  • Removal of jQuery as a dependency.

这是相关的,因为因此:

X-Requested-With is set only by AJAX libraries like jQuery, Mootools, Prototype etc.


CodeIgniter 的 is_ajax_request() 源代码如下所示:

/ci/system/core/input.php:

/**
 * Is AJAX request?
 *
 * Test to see if a request contains the HTTP_X_REQUESTED_WITH header.
 *
 * @return    bool
 */
public function is_ajax_request()
{
  return ( ! empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest');
}

这意味着可以通过多种方式找到解决方案...

  1. 破解 FullCalendar 的 /core/main.js 文件并添加:

    requestJson() 方法中的 xhr.open() 调用后立即添加以下行:

    xhr.setRequestHeader('X-Requested-With', 'xmlhttprequest'); /* Food for CI's $this->input->is_ajax_request() */
    
  2. 如果您从不期望标准页面加载有任何 $_POST 值(我的应用程序就是如此),请不要将 is_ajax_request() 用于此特定任务。在您的控制器中,只需使用它:

    if (!empty($_POST)) {
    

    或更简单(因为总是声明超全局)

    if ($_POST) {