如何使我的 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');
}
这意味着可以通过多种方式找到解决方案...
破解 FullCalendar 的 /core/main.js 文件并添加:
在 requestJson()
方法中的 xhr.open()
调用后立即添加以下行:
xhr.setRequestHeader('X-Requested-With', 'xmlhttprequest'); /* Food for CI's $this->input->is_ajax_request() */
如果您从不期望标准页面加载有任何 $_POST 值(我的应用程序就是如此),请不要将 is_ajax_request()
用于此特定任务。在您的控制器中,只需使用它:
if (!empty($_POST)) {
或更简单(因为总是声明超全局)
if ($_POST) {
我正在使用 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'); }
这意味着可以通过多种方式找到解决方案...
破解 FullCalendar 的 /core/main.js 文件并添加:
在
requestJson()
方法中的xhr.open()
调用后立即添加以下行:xhr.setRequestHeader('X-Requested-With', 'xmlhttprequest'); /* Food for CI's $this->input->is_ajax_request() */
如果您从不期望标准页面加载有任何 $_POST 值(我的应用程序就是如此),请不要将
is_ajax_request()
用于此特定任务。在您的控制器中,只需使用它:if (!empty($_POST)) {
或更简单(因为总是声明超全局)
if ($_POST) {