CodeIgniter框架下无法获取URL参数到loadLeads方法进行数据过滤
问题根因
URL中的source、status参数属于reports/lists页面的地址参数,而loadLeads是DataTable发起的独立AJAX POST请求,该请求本身没有携带原页面的URL参数,所以在loadLeads中使用$this->input->get()无法获取到对应值。
修复步骤
1. 控制器lists方法中获取参数并传入视图
你已经确认lists方法中可以正常读取URL参数,直接将参数取出传递给视图即可:
public function lists($slug='') { $this->load->model(array('crm/crm_model')); $content['propertyrefnos']=$this->crm_model->property_refnos(); $content['is_mobile'] = $this->ismob; $content['sources']= $this->sources_model->get_active(array(),'id,title','title asc' ); // 新增代码:读取URL参数传递给视图 $content['source'] = $this->input->get('source'); $content['status'] = $this->input->get('status'); $content['slug'] = $slug; }
2. 视图中修正变量,将参数传入AJAX请求
首先修正你视图中原有的变量名错误(PHP中定义的是$leadstatus,JS中调用的是$leadsource,名称不匹配导致值为空),再将两个参数加入AJAX的POST数据中:
<?php $sess=$this->session->userdata(); $post = array('fstatus'=> $sess['fstatus'],'fsource'=> $sess['fsource']); $postd = json_encode(array_filter($post)); // 读取控制器传入的参数 $view_source = $source; $view_status = $status; ?>
JS部分修改:
$(document).ready(function() { function sendreq(){ setpostdatas();cleartable();getleads(); } var userrole = "<?php echo $this->session->userdata('clientrole')?>"; // 读取PHP传入的参数 var leadsource = "<?php echo $view_source ?>"; var leadstatus = "<?php echo $view_status ?>"; var slug = '<?php echo $slug?>'; var postd = '<?php echo $postd; ?>'; if( userrole > 1 && userrole != 5){ $('#item-list').DataTable({ "processing": true, "stateSave": true, "serverSide": true, "ordering": false, "createdRow": function( row, data, dataIndex){ $(row).has( "div.overdueupdate" ).css('background-color','#FFC7CE'); }, "ajax": { url: "<?php echo site_url(); ?>reports/loadLeads", // 将参数加入POST数据 data: {slug: slug, postdata: postd, leadsource: leadsource, leadstatus: leadstatus}, type : 'POST', "dataSrc": function ( d ) { d.myKey = "myValue"; if(d.recordsTotal == 0 || d.data == null){ $("#item-list_info").text("No records found"); $("#item-list_processing").css("display","none"); } return d.data; } }, 'columns': [ {"data": "id", "id": "id"}, {"data": "refno", "refno": "refno"}, {"data": "source", "source": "source"}, ] }); }
3. loadLeads方法中从POST读取参数
AJAX是POST请求,所以要从POST中读取参数,不要使用GET方法:
public function loadLeads($p=''){ // 修正为从POST读取参数 $leadsource = $this->input->post('leadsource'); $leadstatus = $this->input->post('leadstatus'); if(isset($_POST['postdata'])){ if($_POST['postdata'] != null && $_POST['postdata'] != 'null'){ $post=$_POST['postdata']; } $post = json_decode($post,true); unset($post['slug']); unset($post['page']); $sort = $post['afsort'] ?? ''; if($sort == "asc"){ $sortQ = 'l.updated_date asc,'; }else if ($sort == "desc"){ $sortQ = 'l.updated_date desc,'; } } $offset = (int)$_POST['start'] ; $pstdatas = explode(',', $_POST['postdata']); unset($pstdatas['item-list_length']); if($this->session->userdata('clientrole') == 1 || $this->session->userdata('clientrole') == 5 ){ $content['leads']=$this->leads_model->get_pagination($_POST['length'],$offset,$where,'',false,$sortQ?$sortQ:'l.assign_status =\'Unassigned\' desc,',$all,$leadsource); }else{ $content['leads']=$this->leads_model->get_pagination($_POST['length'],$offset,$where,'',false,$sortQ?$sortQ:'l.assigned_date desc,',$all,$leadsource); } }
4. 模型中删除多余的GET取值逻辑
你已经将$leadsource作为参数传入模型方法,直接使用即可,不需要再尝试从GET获取参数:
function get_pagination($num, $offset, $cond='',$order='',$unlimit=false,$add_order='',$all='',$leadsource) { $this->db->select("l.*"); $sess=$this->session->userdata(); if(is_array($cond) && count($cond)>0){ $this->db->where($cond); } if(empty($cond)){ if($sess['afstatus']==''){ // 删除这行多余的GET取值代码:$leadsource = $this->input->get('status'); if($searchdata['keyword'] !='' || $searchdata['fstatus'] !='' || $searchdata['fproject'] || $searchdata['fdevelop'] || $all != ''){ $this->db->where_in('lead_status',array(1,8,9,2,3,4,10,11)); $this->db->where('lead_source',$leadsource); } else{ $this->db->where_in('lead_status',array(1,8,9,11)); $this->db->where('lead_source',$leadsource); } } } $query = $this->db->get(); return $query->result_array(); }
内容的提问来源于stack exchange,提问作者H2O
相关产品推荐
相关产品推荐

