Codeigniter产品更新页依赖下拉框(尺寸)数据不显示问题
解决CodeIgniter编辑产品时尺寸下拉框不显示对应数据的问题
我帮你梳理下现有代码里的核心问题,然后一步步给出修复方案:
问题1:尺寸下拉框的name属性错误
在product_update_view.php里,尺寸下拉框的name属性写错成了category,这会导致提交表单时无法正确获取尺寸值,先修正这个:
<!-- 原错误代码 --> <select class="form-control" name="category" id="sizes"> <!-- 修改后 --> <select class="form-control" name="size" id="sizes">
问题2:页面初始化时未加载当前产品分类的尺寸
现在的JS只有在category下拉框改变时才会加载尺寸,但进入编辑页面时不会自动触发这个逻辑,导致尺寸下拉框是空的。同时,现有代码也没有处理默认选中当前产品尺寸的逻辑。
方案一:通过AJAX初始化加载并选中尺寸
更新product_update_view.php里的JS代码,封装加载尺寸的函数,页面初始化时主动触发:
$(document).ready(function(){ // 封装加载尺寸的函数,方便复用 function loadSizes(categoryId, selectedSizeId) { $.ajax({ url:"<?php echo base_url() ?>welcome/get_sizes", type: "POST", data: { 'category_id' : categoryId, 'selected_size_id': selectedSizeId }, dataType: 'json', success: function(data){ $('#sizes').html(data); }, error: function(){ alert('Error occur...!!'); } }); } // 页面加载完成后,主动加载当前产品分类的尺寸并选中对应值 var currentCategoryId = $('#category').val(); var currentSizeId = <?php echo $item->size_id; ?>; // 确保item模型返回了size_id字段 if(currentCategoryId !== '') { loadSizes(currentCategoryId, currentSizeId); } // 保留原有的分类切换事件 $('#category').on('change', function(){ var category_id = $(this).val(); if(category_id !== '') { loadSizes(category_id, null); } }); });
这里需要修改item_model.php的item_info方法,确保返回size_id字段,同时优化SQL关联写法:
public function item_info ($itemName) { $this->load->database(); $this->db->select('products.*, category.category_name, sizes.size, sizes.size_id, brand.brand_name') ->from('products') ->join('category', 'products.category_id = category.category_id') ->join('sizes', 'products.size_id = sizes.size_id') ->join('brand', 'products.brand_id = brand.brand_id') ->where('prod_desc', urldecode($itemName)); $result=$this->db->get(); return $result->row(); }
最后修改welcome.php的get_sizes方法,接收选中尺寸ID并生成选中状态:
public function get_sizes() { $category_id = $this->input->post('category_id'); $selected_size_id = $this->input->post('selected_size_id'); $sizes = $this->dep_model->get_sizes_query($category_id); if(count($sizes)>0) { $pro_select_box = '<option value="Select Size">Select Size</option>'; foreach ($sizes as $sz) { $selected = ($sz->size_id == $selected_size_id) ? 'selected="selected"' : ''; $pro_select_box .= '<option value="'.$sz->size_id.'" '.$selected.'>'.$sz->size.'</option>'; } echo json_encode($pro_select_box); } }
方案二:提前在控制器加载尺寸,直接渲染到视图
如果不想用AJAX初始化,也可以在控制器里提前获取尺寸数据,直接渲染到下拉框:
修改item.php的update方法:
public function update($name) { $this->load->model('Dependent_model', 'dep_model', TRUE); $this->load->model('brand_model'); $this->load->model('item_model'); $data['item'] = $this->item_model->item_info($name); $data['category'] = $this->dep_model->get_category_query(); $data['brand'] = $this->brand_model->getBrandName(); // 提前加载当前产品分类的尺寸 $data['sizes'] = $this->dep_model->get_sizes_query($data['item']->category_id); $this->load->view('header'); $this->load->view('side_menu'); $this->load->view('product_update_view.php',$data); $this->load->view('footer'); }
然后在product_update_view.php里渲染尺寸下拉框:
<div class="form-group"> <label for="sizes">Size:</label> <select class="form-control" name="size" id="sizes"> <option value="Select size"> Select Size</option> <?php foreach($sizes as $sz): ?> <option value="<?php echo $sz->size_id; ?>" <?php if ($sz->size_id == $item->size_id) {echo "selected='selected'";} ?>><?php echo $sz->size; ?></option> <?php endforeach; ?> </select> </div>
额外优化建议
- 建议把表单里的隐藏字段
cur_size从存储尺寸名称改成存储$item->size_id,避免尺寸名称重复导致的错误。 - 尽量使用CodeIgniter的
join方法进行表关联,比多个from加where的写法更清晰规范。
内容的提问来源于stack exchange,提问作者rash eminem
相关产品推荐
相关产品推荐

