FullCalendar应用——编辑与删除日程事件

jerry JQuery 2015年08月20日 收藏

FullCalendar可以灵活运用到项目开发中,本站上一篇文章中,我们介绍了如何在FullCalendar新建日程事件,今天我要给大家介绍的是如何在FullCalendar中编辑和删除日程事件,这样我们就完成了FullCalendar上的“增删改查”一系列操作。

HTML

和上一篇文章FullCalendar应用——新建日程事件一样,HTML页面我们仍然使用cal_opt.html,这里HTML代码及相关js和css文件的载入就不再详述,如果您是第一次阅读本文,请先从FullCalendar系列文章第一篇看起。

jQuery

在日历视图中,我们通过单击需要编辑的日程事件项,调用fancybox弹出编辑层。FullCalendar提供了事件单击eventClick方法,请看代码:

  1. $(function() {
  2. $('#calendar').fullCalendar({
  3. //单击事件项时触发
  4. eventClick: function(calEvent, jsEvent, view) {
  5. $.fancybox({
  6. 'type':'ajax',
  7. 'href':'event.php?action=edit&id='+calEvent.id
  8. });
  9. }
  10. });
  11. });

单击事件项,调用了fancybox,和新建事件一样,采用ajax方式,通过传参,请求了编辑表单页面。

event.php

event.php根据请求过来的参数,读取对应id的日历事件,并将数据完整的现实在编辑表单中。我们将整个读取与显示编辑层的代码混编在event.php中,当然实际开发中,你可能会使用zend、thinkphp等框架,让PHP和html模板分离。下面的代码我们将编辑模块写在了自定义函数editform()中,那么event.php是根据传递的action参数来调用editform()的。

  1. <?php
  2. function editform($id){
  3. $query = mysql_query("select * from calendar where id='$id'");
  4. $row = mysql_fetch_array($query);
  5. if($row){
  6. $id = $row['id'];
  7. $title = $row['title'];
  8. $starttime = $row['starttime'];
  9. $start_d = date("Y-m-d",$starttime);
  10. $start_h = date("H",$starttime);
  11. $start_m = date("i",$starttime);
  12. $endtime = $row['endtime'];
  13. if($endtime==0){
  14. $end_d = $startdate;
  15. $end_chk = '';
  16. $end_display = "style='display:none'";
  17. }else{
  18. $end_d = date("Y-m-d",$endtime);
  19. $end_h = date("H",$endtime);
  20. $end_m = date("i",$endtime);
  21. $end_chk = "checked";
  22. $end_display = "style=''";
  23. }
  24. $allday = $row['allday'];
  25. if($allday==1){
  26. $display = "style='display:none'";
  27. $allday_chk = "checked";
  28. }else{
  29. $display = "style=''";
  30. $allday_chk = '';
  31. }
  32. }
  33. ?>
  34. <link rel="stylesheet" type="text/css" href="css/jquery-ui.css">
  35. <div class="fancy">
  36. <h3>编辑事件</h3>
  37. <form id="add_form" action="do.php?action=edit" method="post">
  38. <input type="hidden" name="id" id="eventid" value="<?php echo $id;?>">
  39. <p>日程内容:<input type="text" class="input" name="event" id="event" style="width:320px"
  40. placeholder="记录你将要做的一件事..." value="<?php echo $title;?>"></p>
  41. <p>开始时间:<input type="text" class="input datepicker" name="startdate"
  42. id="startdate" value="<?php echo $start_d;?>" readonly>
  43. <span id="sel_start" <?php echo $display;?>><select name="s_hour">
  44. <option value="<?php echo $start_h;?>" selected><?php echo $start_h;?></option>
  45. <option value="00">00</option>
  46. ...//这里省略多个option,下同
  47. </select>:
  48. <select name="s_minute">
  49. <option value="<?php echo $start_m;?>" selected><?php echo $start_m;?></option>
  50. <option value="00">00</option>
  51. ...
  52. </select>
  53. </span>
  54. </p>
  55. <p id="p_endtime" <?php echo $end_display;?>>结束时间:<input type="text" class="input datepicker"
  56. name="enddate" id="enddate" value="<?php echo $end_d;?>" readonly>
  57. <span id="sel_end" <?php echo $display;?>><select name="e_hour">
  58. <option value="<?php echo $end_h;?>" selected><?php echo $end_h;?></option>
  59. ...
  60. </select>:
  61. <select name="e_minute">
  62. <option value="<?php echo $end_m;?>" selected><?php echo $end_m;?></option>
  63. ...
  64. </select>
  65. </span>
  66. </p>
  67. <p>
  68. <label><input type="checkbox" value="1" id="isallday" name="isallday" <?php echo $allday_chk;?>>
  69. 全天</label>
  70. <label><input type="checkbox" value="1" id="isend" name="isend" <?php echo $end_chk;?>> 结束时间</label>
  71. </p>
  72. <div class="sub_btn"><span class="del"><input type="button" class="btn btn_del" id="del_event"
  73. value="删除"></span><input type="submit" class="btn btn_ok" value="确定">
  74. <input type="button" class="btn btn_cancel" value="取消" onClick="$.fancybox.close()"></div>
  75. </form>
  76. </div>
  77. <?php }?>

关键是处理日期和时间的显示,当然这也不是本文重点,大家可以下载源码慢慢研究。

我们还需要加入代码处理表单提交和验证,和上文的新建事件一样,我们使用了jquery.form.js插件,代码也基本和新建事件一样。

  1. $(function(){
  2. $(".datepicker").datepicker({minDate: -3,maxDate: 3});
  3. $("#isallday").click(function(){
  4. if($("#sel_start").css("display")=="none"){
  5. $("#sel_start,#sel_end").show();
  6. }else{
  7. $("#sel_start,#sel_end").hide();
  8. }
  9. });
  10. $("#isend").click(function(){
  11. if($("#p_endtime").css("display")=="none"){
  12. $("#p_endtime").show();
  13. }else{
  14. $("#p_endtime").hide();
  15. }
  16. $.fancybox.resize();//调整高度自适应
  17. });
  18. //提交表单
  19. $('#add_form').ajaxForm({
  20. beforeSubmit: showRequest, //表单验证
  21. success: showResponse //成功返回
  22. });
  23. });
  24. function showRequest(){
  25. var events = $("#event").val();
  26. if(events==''){
  27. alert("请输入日程内容!");
  28. $("#event").focus();
  29. return false;
  30. }
  31. }
  32. function showResponse(responseText, statusText, xhr, $form){
  33. if(statusText=="success"){
  34. if(responseText==1){
  35. $.fancybox.close();
  36. $('#calendar').fullCalendar('refetchEvents'); //重新获取所有事件数据
  37. }else{
  38. alert(responseText);
  39. }
  40. }else{
  41. alert(statusText);
  42. }
  43. }

do.php

do.php用来处理新建、编辑和删除事件。编辑事件主要是通过接收表单post过来的数据,更新数据表中对应id的事件数据内容,如果更新成功就返回1,那么前端接收到更新成功的消息就会自动关闭fancybox层,并刷新日历视图。

  1. include_once('connect.php');//连接数据库
  2. $action = $_GET['action'];
  3. if($action=='add'){
  4. //新建事件
  5. }elseif($action=="edit"){
  6. //编辑事件
  7. $id = intval($_POST['id']);
  8. if($id==0){
  9. echo '事件不存在!';
  10. exit;
  11. }
  12. $events = stripslashes(trim($_POST['event']));//事件内容
  13. $events=mysql_real_escape_string(strip_tags($events),$link); //过滤HTML标签,并转义特殊字符
  14. $isallday = $_POST['isallday'];//是否是全天事件
  15. $isend = $_POST['isend'];//是否有结束时间
  16. $startdate = trim($_POST['startdate']);//开始日期
  17. $enddate = trim($_POST['enddate']);//结束日期
  18. $s_time = $_POST['s_hour'].':'.$_POST['s_minute'].':00';//开始时间
  19. $e_time = $_POST['e_hour'].':'.$_POST['e_minute'].':00';//结束时间
  20. if($isallday==1 && $isend==1){
  21. $starttime = strtotime($startdate);
  22. $endtime = strtotime($enddate);
  23. }elseif($isallday==1 && $isend==""){
  24. $starttime = strtotime($startdate);
  25. $endtime = 0;
  26. }elseif($isallday=="" && $isend==1){
  27. $starttime = strtotime($startdate.' '.$s_time);
  28. $endtime = strtotime($enddate.' '.$e_time);
  29. }else{
  30. $starttime = strtotime($startdate.' '.$s_time);
  31. $endtime = 0;
  32. }
  33. $isallday = $isallday?1:0;
  34. mysql_query("update `calendar` set `title`='$events',`starttime`='$starttime',`endtime`='$endtime',
  35. `allday`='$isallday' where `id`='$id'");
  36. if(mysql_affected_rows()==1){
  37. echo '1';
  38. }else{
  39. echo '出错了!';
  40. }
  41. }elseif($action=="del"){
  42. //删除事件
  43. }else{
  44. }

删除日程事件

在弹出的编辑表单层中,还有一个删除按钮,当我们点击删除按钮时,同样的发送ajax请求到do.php中,由do.php根据请求删除数据表中对应的日程记录,并返回成功的信息。

在event.php中还应该加上一段js:

  1. $(function(){
  2. ...
  3. //删除事件
  4. $("#del_event").click(function(){
  5. if(confirm("您确定要删除吗?")){
  6. var eventid = $("#eventid").val();
  7. $.post("do.php?action=del",{id:eventid},function(msg){
  8. if(msg==1){//删除成功
  9. $.fancybox.close();
  10. $('#calendar').fullCalendar('refetchEvents'); //重新获取所有事件数据
  11. }else{
  12. alert(msg);
  13. }
  14. });
  15. }
  16. });
  17. });

do.php也要加上删除操作。

  1. ...
  2. }elseif($action=="del"){//删除
  3. $id = intval($_POST['id']);
  4. if($id>0){
  5. mysql_query("delete from `calendar` where `id`='$id'");
  6. if(mysql_affected_rows()==1){
  7. echo '1';
  8. }else{
  9. echo '出错了!';
  10. }
  11. }else{
  12. echo '事件不存在!';
  13. }
  14. }

好了,本文介绍了编辑和删除fullCalendar日历事件,文中给出的代码不是连贯的,建议不要直接复制使用,您可以看明白了再测试,当然,如果你够懒,可以下载本文提供的打包文件,包括读取、新建、编辑和删除日程事件功能。Hellwoeba.com感谢您的关注,接下来月光光会对fullCalendar的最后一个操作:拖动及保存日程事件做讲解以及总结,敬请关注。

下载地址