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

CodeIgniter中DataTables服务器端自定义筛选失效问题排查

解决CodeIgniter中DataTables服务器端自定义筛选失效问题

嘿,我帮你定位到问题根源了!你的自定义筛选功能失效核心原因是前后端传递的参数名称不匹配,还有几处代码细节需要调整,咱们一步步来修复:

1. 核心问题:前后端参数名不匹配

你前端JS传递的参数名称和后端Model接收的名称完全对不上,导致服务器根本拿不到你的筛选值:

  • 前端传surat_id_index → 后端用$this->input->post('index')接收
  • 前端传surat_no → 后端用$this->input->post('nomor')接收
  • 前端传surat_kode → 后端用$this->input->post('kode')接收
  • 前端传surat_kategori_id → 后端用$this->input->post('kategori')接收

2. 次要问题:默认搜索逻辑存在潜在bug

你把Model中foreach ($this->column_search as $item)的循环注释掉了,导致$item变量未定义,虽然你说默认筛选正常,但这是不稳定的潜在bug,必须恢复循环才能正确处理多列搜索。

3. 体验优化:下拉框显示分类ID而非名称

你的下拉框当前显示的是分类ID,用户体验不好,需要调整为显示分类名称。


修改方案与代码调整

① 修正前端JS的参数传递

调整JS中data函数的参数名,和后端接收的名称保持一致:

"data": function ( data ) {
    data.index = $('#index').val();
    data.nomor = $('#nomor').val();
    data.kode = $('#kode').val();
    data.kategori = $('#kategori').val();
}

② 恢复Model中的默认搜索循环

把注释掉的foreach循环恢复,确保多列搜索逻辑正常:

public function get_datatables_query() {
    // ... 原有代码省略 ...

    $i = 0;
    foreach ($this->column_search as $item) // 取消注释这个循环
    {
        if(isset($_POST['search']['value'])) // if datatable send POST for search
        {
            if($i===0) // first loop
            {
                $this->db->group_start(); // open bracket. query Where with OR clause better with bracket. because maybe can combine with other WHERE with AND.
                $this->db->like($item, $_POST['search']['value']);
            }
            else
            {
                $this->db->or_like($item, $_POST['search']['value']);
            }

            if(count($this->column_search) - 1 == $i) //last loop
                $this->db->group_end(); //close bracket
        }
        $i++;
    }

    // ... 原有代码省略 ...
}

③ 优化分类下拉框的数据源

修改get_list_kategori方法,直接从分类表获取ID和名称(避免从surat_masuk表取重复值):

public function get_list_kategori() {
    $this->db->select('cat_id, cat_name');
    $this->db->from('kategori');
    $this->db->order_by('cat_name','asc');
    $query = $this->db->get();
    return $query->result();
}

④ 调整Controller中下拉框的生成逻辑

让下拉框显示分类名称,值为分类ID:

function index() {
    $this->load->model('admin_kategori/Kategori_model');
    $all_kategori = $this->Surat_masuk_model->get_list_kategori();
    $opt = array('' => 'Semua Kategori');
    foreach ($all_kategori as $kategori) {
        $opt[$kategori->cat_id] = $kategori->cat_name;
    }
    $data['kategori'] = form_dropdown('',$opt,'','id="kategori" class="form-control select2"');
    // ... 原有代码省略 ...
}

调试小技巧

修改完成后,你可以在ajax_list方法中添加var_dump($_POST); die();,查看前端传递的所有参数是否正确到达后端,方便快速排查问题。

内容的提问来源于stack exchange,提问作者MandaCoby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:57:58