
本文详细介绍了如何在fullcalendar 3中从php后端加载多个事件数据。我们将探讨两种主要方法:一是将php数组转换为fullcalendar要求的json格式并直接注入到javascript中;二是推荐使用fullcalendar的json事件源功能,通过ajax请求动态获取事件数据,实现更灵活和高效的事件管理。
FullCalendar是一个功能强大的JavaScript日历库,常用于展示和管理日程事件。在实际应用中,事件数据通常来源于后端数据库,并通过PHP等服务器端语言进行处理。将PHP中的动态事件数据传递给FullCalendar是常见的需求,尤其当事件数量较多或需要动态加载时,如何高效且正确地传递多事件数组显得尤为重要。本文将详细阐述两种实现方式,并提供相应的代码示例。
FullCalendar对事件数据有特定的JSON格式要求。每个事件都应该是一个JavaScript对象,至少包含title和start属性。如果事件有结束日期,还可以包含end属性。例如:
events: [
{
title: '事件标题一',
start: '2021-12-02'
},
{
title: '事件标题二',
start: '2021-12-03',
end: '2021-12-04'
},
{
title: '事件标题三',
url: 'https://example.com/',
start: '2021-12-24'
}
]因此,无论数据来源于何处,最终都需要被转换为这种包含多个事件对象的JavaScript数组形式。
这种方法适用于事件数量相对较少,或者在页面加载时一次性获取所有事件的场景。核心思想是将PHP数组转换为FullCalendar要求的格式,然后使用json_encode将其转换为JSON字符串,并直接嵌入到HTML中的JavaScript代码块里。
立即学习“PHP免费学习笔记(深入)”;
原始的PHP数组可能将日期作为键,事件标题作为值,例如:
$arrayDate = [ "2021-12-02" => "SG-12345-0 : xx, yy", "2021-12-03" => "SG-156645-0 : aa, bb", "2021-12-02" => "SG-13435-0 : cc, dd", // 注意:同一个日期可以有多个事件 "2021-12-04" => "SG-76864-0 : ee, ff" ];
FullCalendar无法直接识别这种格式。正确的PHP数组结构应该是一个包含多个关联数组的数组,每个关联数组代表一个事件:
<?php $arrayDate = [ ["start" => "2021-12-02", "title" => "SG-12345-0 : xx, yy"], ["start" => "2021-12-03", "title" => "SG-156645-0 : aa, bb"], ["start" => "2021-12-02", "title" => "SG-13435-0 : cc, dd"], ["start" => "2021-12-04", "title" => "SG-76864-0 : ee, ff"] ]; ?>
如果原始数据是键值对形式,可以通过循环转换:
<?php
$rawArray = [
"2021-12-02" => "SG-12345-0 : xx, yy",
"2021-12-03" => "SG-156645-0 : aa, bb",
// ... 其他事件
];
$formattedEvents = [];
foreach ($rawArray as $date => $title) {
$formattedEvents[] = ["start" => $date, "title" => $title];
}
// 此时 $formattedEvents 就是 FullCalendar 期望的格式
?>将格式化后的PHP数组通过json_encode函数直接输出到JavaScript的events配置项中。
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>FullCalendar PHP 多事件示例</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.1.0/fullcalendar.min.css" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.7/semantic.min.css" crossorigin="anonymous">
</head>
<body>
<div class="ui container">
<div class="ui grid">
<div class="ui sixteen column">
<div id="calendar"></div>
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.1.0/fullcalendar.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.7/semantic.min.js"></script>
<script>
$(document).ready(function() {
// PHP代码在这里执行,生成JSON格式的事件数据
<?php
$eventsFromPHP = [
["start" => "2021-12-02", "title" => "SG-12345-0 : xx, yy"],
["start" => "2021-12-03", "title" => "SG-156645-0 : aa, bb"],
["start" => "2021-12-02", "title" => "SG-13435-0 : cc, dd"],
["start" => "2021-12-04", "title" => "SG-76864-0 : ee, ff"]
];
?>
$('#calendar').fullCalendar({
defaultDate: '2021-12-02',
eventLimit: true, // 当事件过多时显示“更多”链接
events: <?php echo json_encode($eventsFromPHP); ?> // 直接注入JSON数据
});
});
</script>
</body>
</html>这种方法的优点是简单直接,但缺点是所有事件数据在页面加载时一次性传输,对于大量事件可能会影响页面加载速度,且不利于动态更新。
对于更复杂的应用场景,例如事件数量庞大、需要按需加载(如用户切换月份时加载对应月份的事件),或需要与后端进行更频繁的交互,FullCalendar提供的JSON事件源(JSON Feed)是更优的选择。
在FullCalendar的配置中,events选项可以接受一个URL字符串,指向一个返回JSON事件数据的后端接口。
$(document).ready(function() {
$('#calendar').fullCalendar({
defaultDate: '2021-12-02',
eventLimit: true,
// 指定事件源URL
events: 'events.php' // 假设后端接口为 events.php
});
});当FullCalendar需要事件数据时,它会自动向events.php发送一个GET请求,并在请求中附带start和end参数,表示当前视图的起始和结束日期。例如:events.php?start=2021-12-01&end=2021-12-31。
events.php脚本需要完成以下任务:
<?php
// 设置响应头,告知浏览器返回的是JSON数据
header('Content-Type: application/json');
// 获取FullCalendar发送的start和end日期参数
// 注意:FullCalendar发送的日期格式通常是ISO 8601 (YYYY-MM-DDTHH:MM:SSZ)
// 这里我们简化为YYYY-MM-DD
$start_date = isset($_GET['start']) ? date('Y-m-d', strtotime($_GET['start'])) : date('Y-m-01');
$end_date = isset($_GET['end']) ? date('Y-m-d', strtotime($_GET['end'])) : date('Y-m-t');
// 模拟从数据库获取事件数据
// 在实际应用中,这里会连接数据库,执行SQL查询
// 例如:SELECT title, start_date, end_date FROM events WHERE start_date >= :start AND start_date <= :end
$rawEvents = [
// 假设这些事件来自数据库,并且符合查询的日期范围
["id" => "1", "title" => "项目会议", "start" => "2021-12-05", "end" => "2021-12-06"],
["id" => "2", "title" => "客户拜访", "start" => "2021-12-10"],
["id" => "3", "title" => "团队建设", "start" => "2021-12-15", "allDay" => true],
["id" => "4", "title" => "技术分享", "start" => "2021-12-20", "url" => "https://example.com/tech-share"],
["id" => "5", "title" => "年度总结", "start" => "2021-12-25"],
// 示例中包含一些在默认日期范围外的事件,以模拟数据库查询过滤
["id" => "6", "title" => "下月计划", "start" => "2022-01-01"],
];
$events = [];
foreach ($rawEvents as $event) {
// 简单过滤:只返回在请求日期范围内的事件
// 在实际应用中,数据库查询会直接完成这个过滤
if ($event['start'] >= $start_date && $event['start'] <= $end_date) {
$events[] = $event;
}
}
// 将PHP数组转换为JSON字符串并输出
echo json_encode($events);
?>本文详细介绍了在FullCalendar 3中从PHP加载多事件数组的两种方法。直接注入法适用于静态或少量事件,配置简单直接。而JSON事件源法(AJAX方式)是处理动态、大量事件数据的推荐方案,它提供了更好的性能、可维护性和前后端分离的优势。在实际开发中,应根据项目需求和事件数据的特性选择最合适的方法,并注意数据格式、错误处理和安全性等方面的最佳实践。
以上就是在FullCalendar 3中传递PHP多事件数组的完整指南的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号