CodeIgniter中FullCalendar如何仅加载指定课程的日程
问题背景
被该问题困扰已有两周,始终未能定位故障原因。
数据库中存在一张名为course的数据表,用户可在系统中添加附带日程安排的课程,相关数据均存储在该表中。
故障现象:“编辑课程”页面内的FullCalendar日历控件会加载展示course表中所有课程的全部日程。
预期效果:编辑某一特定课程的信息时,日历控件仅展示当前正在编辑的课程对应的日程,而非全量课程日程。
当前日历展示全量课程日程的效果截图:
现有实现代码
控制器load方法
public function load() { $event_data = $this->crud_model->fetch_all_event(); foreach($event_data->result_array() as $row) { $data[] = array( 'id' => $row['id'], 'title' => $row['sched_desc'], 'start' => $row['start'], 'end' => $row['end'] ); } echo json_encode($data); }
模型层原有fetch_all_event方法
public function fetch_all_event($course_id = "") { $this->db->order_by('id'); $this->db->select("*"); return $this->db->get('course'); }
前端FullCalendar初始化脚本
<script> $(document).ready(function(){ var calendar = $('#calendar').fullCalendar({ editable:false, header:{ left:'prev,next today', center:'title', right:'month,agendaWeek,agendaDay' }, events:"<?php echo base_url(); ?>user/load" }); }); </script>
已尝试的无效修改
此前尝试修改模型层代码,但功能未正常生效,修改后的代码如下:
public function fetch_all_event($course_id) { $course_details = $this->get_course_by_id($course_id)->row_array(); $id = $course_details['id']; $this->db->order_by('id'); $this->db->select("*"); $this->db->where('id', $id); return $this->db->get('course'); } public function get_course_by_id($course_id = "") { return $this->db->get_where('course', array('id' => $course_id)); }
故障原因
之前修改未生效的核心问题有三点:
- 控制器调用
fetch_all_event()时未传入当前编辑的课程ID,模型层无法拿到过滤参数 - 前端FullCalendar请求事件接口时,未携带当前课程ID参数,接口不知道需要返回哪门课的日程
- 修改后的模型层逻辑存在冗余的重复查询,且未做参数非空判断,无课程ID传入时会直接报错
修复方案
1. 修改前端初始化代码
编辑页一般会预置当前编辑的课程ID变量,假设页面中已通过PHP输出当前课程ID为$current_course_id,修改events请求地址,携带课程ID参数:
<script> $(document).ready(function(){ // 请将下方变量替换为你页面中实际存储当前编辑课程ID的取值方式 var currentCourseId = "<?php echo $current_course_id; ?>"; var calendar = $('#calendar').fullCalendar({ editable:false, header:{ left:'prev,next today', center:'title', right:'month,agendaWeek,agendaDay' }, events:"<?php echo base_url(); ?>user/load?course_id=" + currentCourseId }); }); </script>
2. 修改控制器load方法
从请求中获取前端传递的课程ID,传入模型层方法:
public function load() { // 获取GET传入的course_id,第二个参数开启XSS过滤 $course_id = $this->input->get('course_id', true); $event_data = $this->crud_model->fetch_all_event($course_id); $data = []; foreach($event_data->result_array() as $row) { $data[] = array( 'id' => $row['id'], 'title' => $row['sched_desc'], 'start' => $row['start'], 'end' => $row['end'] ); } echo json_encode($data); }
3. 修正模型层方法
去掉冗余查询,增加参数判断,仅当传入有效课程ID时做过滤:
public function fetch_all_event($course_id = "") { $this->db->order_by('id'); $this->db->select("*"); if (!empty($course_id)) { // 如果日程存储在独立关联表,此处将'id'改为对应关联课程的外键字段名,例如'course_id' $this->db->where('id', $course_id); } return $this->db->get('course'); }
注意:之前新增的
get_course_by_id方法为冗余逻辑,可以直接删除。如果你的课程日程存储在独立的日程关联表而非course主表,只需要调整模型层的表名和where条件字段即可,整体传参逻辑不变。
修改完成后清空浏览器缓存、CodeIgniter框架缓存(若开启)后测试即可。
内容的提问来源于stack exchange,提问作者Jadey
相关产品推荐
相关产品推荐

