如何在Jquery fullcalendar中显示重复出现的事件?比如特定日的事件开始并继续运行下一年,那么我将如何在fullcalendar中显示它。
注意:事件信息来自数据库
答案 0 :(得分:14)
完整日历不支持开箱即用的重复活动。这就是我做的。
当我添加一个事件时,我有一个用于重复事件的选择框。假设用户选择它每周重复一次。然后,我将一个事件插入到我的事件表中,父事件ID对于该事件的所有实例都是相同的。
完整日历使重复活动必须具有相同的事件ID。所以在我的事件表中,我有一个唯一的事件ID列和一个父ID,它是我用来呈现事件的列。
所以无论如何,在我插入第一个事件后,我立即运行一个循环,选择具有相同父ID的最后一个插入事件,向其添加7天,然后将其插入到事件表中。我循环这个过程50次,然后我有一个事件,每周发生一年。
以下是一些代码:
当用户选择时间范围时,我打开一个对话框
select: function(start, end){
$( "#add_class" ).dialog( "open" );
},
在对话框中,我有一个下拉选择
<div id="add_class" title="Add New Class">
<form action="">
<div id="recurring_event">
<label for = "recurring">Recurring </label>
<input type="checkbox" name="recurring" id="recurring" />
<div id = "recurring_options" >
Repeat every <select name = "repeat_frequency" id = "repeat_frequency">
<option value ="1">Day</option>
<option value="7" selected="selected">Week</option>
<option value = "28">Month</option>
</select>
</div>
</div>
</form>
</div>
然后我使用AJAX将此信息提交到名为add_class.php
的php页面$( "#add_class" ).dialog({
"Save Class": function() {
var repeat_frequency = $("#repeat_frequency").val();
$.ajax({
type:"POST",
url: "add_class.php",
data: "repeat_frequency=" + repeat_frequency,
async: false,
});
$('#calendar').fullCalendar('refetchEvents');
$( this ).dialog( "close" );
},
Cancel: function() {
$( this ).dialog( "close" );
}
},
这是add_class.php部分,我实际将其输入数据库
$repeat_frequency = $_POST['repeat_frequency'];
$dbh = new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", $mysql_username, $mysql_password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_USE_BUFFERED_QUERY);
$stmt = $dbh->prepare(
"INSERT INTO events (start, end) //whatever variables you received from the AJAX post on the dialog form
VALUES (:start, :end)");
$stmt->bindParam(':start', $start);
$stmt->bindParam(':end', $end);
$stmt->execute();
$id = $dbh->lastInsertId();
for($x = 0; $x < "51"; $x++) {
$stmt = $dbh->prepare("
SELECT start, end
FROM events
WHERE event_id = :event_id ");
$stmt->bindParam(':event_id', $event_id, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
$start = $result['start'];
$end = $result['end'];
$start_date= strtotime($start . '+' . $repeat_frequency . 'DAYS');
$end_date= strtotime($end . '+' . $repeat_frequency . 'DAYS');
$start = date("Y-m-d H:i", $start_date);
$end = date("Y-m-d H:i", $end_date);
unset($stmt);
$stmt = $dbh->prepare(
"INSERT INTO events (start, end ) //and whatever other columns you need
VALUES (:start, :end)");
$stmt->bindParam(':start', $start, PDO::PARAM_STR);
$stmt->bindParam(':end', $end, PDO::PARAM_STR);
$stmt->execute();
$event_id = $dbh->lastInsertId();
}
所以这只是事情的一般要点。希望没有太多的拼写错误,因为我试图将其编辑到只需要了解要点的基本要素。如果您有任何疑问,请告诉我。
修改强>
要在fullcalendar上“显示”事件,您需要拥有一个事件源。
查看此链接
http://fullcalendar.io/docs/event_data/events_json_feed/
在json-events.php中,您回显事件数据,然后它会显示在您的日历上。
有类似的内容在您的日历页面上显示活动
$('#calendar').fullCalendar({
events: '/myfeed.php'
});
在myfeed.php文件中有类似
的内容 $dbh = new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", $mysql_username, $mysql_password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // set the error mode to excptions
$stmt = $dbh->prepare("SELECT
event_id, title, start, end
FROM events
ORDER BY start");
$stmt->execute();
$events = array();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){ //important ! $start = "2010-05-10T08:30"; iso8601 format !!
$eventArray['id'] = $row['event_id'];
$eventArray['title'] = $row['title'];
$eventArray['start'] = $row['start'];
$eventArray['end'] = $row['end'];
$events[] = $eventArray;
echo json_encode($events);
如果您仍有疑问,请在此处搜索stackoverflow。我想我已经解释得很好并提供了大量的代码。这是我发表的一篇博文,可能也有帮助http://fajitanachos.com/Fullcalendar-and-recurring-events/我找到了在这里和fullcalendar主页上运行fullcalendar所需的一切http://fullcalendar.io/
我希望这会有所帮助。
答案 1 :(得分:0)
为重复事件创建事件实例不是很好。 例如,如果重复频率是每天一次,并且终止于一年,那么它将需要在数据库中进行356行。 我可以找到有关重复事件的很好的文档。
让我分享博客网址。 https://github.com/bmoeskau/Extensible/blob/master/recurrence-overview.md
这是很久以前的博客,但是它的算法确实很好。
这是实现定期事件操作的纯PHP文件 https://github.com/bmoeskau/Extensible/blob/master/examples/server/php/api/recur.php
希望从此博客获得帮助。 谢谢。