You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 22:06:18