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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:58:24