CodeIgniter提交筛选表单后丢失URL分类参数全量展示产品如何解决
问题修复方案
核心问题是筛选表单提交的目标地址未携带当前分类参数,导致控制器无法获取分类标识,分类筛选条件失效。同时原有模型的查询逻辑存在条件优先级错误,会出现跨分类查询的问题,可按以下步骤修改:
1. 修改控制器方法,将当前分类名传递到视图
public function products() { $id = $this->uri->segment(3); $material = $this->input->post('material1'); $material2 = $this->input->post('material2'); // 将当前分类名传入视图,用于拼接表单提交地址 $data['current_cname'] = $id; // 把选中的材质也传入视图,用于提交后保留勾选状态 $data['selected_m1'] = $material; $data['selected_m2'] = $material2; $data['products'] = $this->product->findAll($id,$material,$material2); $this->load->view('products', $data); }
2. 修改筛选表单的提交地址,携带分类参数
和你原分类跳转的URL结构保持一致,同时添加勾选状态保留逻辑:
<form action="<?php echo base_url('homecontroller/products/'.$current_cname); ?>" method="post"> <input type="checkbox" name="material1" value="cotton" class="form-check-input filled-in" id="new" onChange="this.form.submit()" <?php if($selected_m1 == 'cotton') echo 'checked';?>> <input type="checkbox" name="material2" value="polyster" class="form-check-input filled-in" id="used" onChange="this.form.submit()" <?php if($selected_m2 == 'polyster') echo 'checked';?>> </form>
3. 修复模型查询的逻辑错误
原有逻辑的or_where会导致条件优先级错误,会查询出其他分类下匹配材质的产品,需要用分组查询包裹材质筛选条件:
function findAll($id,$material,$material2) { $this->db->where('cname', $id); if(!empty($material) || !empty($material2)) { // 开启条件分组,保证材质筛选和分类筛选是AND关系 $this->db->group_start(); if(!empty($material)) { $this->db->where('material', $material); } if(!empty($material2)) { $this->db->or_where('material', $material2); } $this->db->group_end(); } return $this->db->get('product')->result(); }
内容的提问来源于stack exchange,提问作者Zubi Da
相关产品推荐
相关产品推荐

