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
相关产品推荐
相关产品推荐

