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

Yii框架ActiveForm中如何通过store_id动态生成对应商品下拉列表?

问题分析与解决方案

你的核心问题是当前代码仅在页面加载时一次性渲染产品列表,页面初始化时$model->output_store_id通常为空,导致产品下拉框无数据;同时缺少前端交互逻辑,无法在选择门店后动态更新产品选项。另外原代码存在语法错误:where('store_id' => $model->output_store_id)需改为数组形式where(['store_id' => $model->output_store_id]),不过这是次要问题,核心缺失是动态加载逻辑。


步骤1:修改视图代码

保留门店下拉框,将产品下拉框初始化为空,添加前端AJAX监听逻辑:

<?php $form = ActiveForm::begin(); ?>
    <div class="container-fluid row">
        <div class="col-md-4">
            <?= $form->field($model, 'output_store_id')->dropDownList(
                ArrayHelper::map(Store::find()
                ->where(['manager_id' => Yii::$app->user->identity->id])
                ->all(),'store_id','name'),
                ['prompt' => 'Select Store', 'id' => 'output-store',
                 'class' => 'form-control text-center']
            ) ?>
        </div>
        <div class="col-md-4">
            <?= $form->field($model, 'product_id')->dropDownList(
                [], // 初始为空
                ['prompt' => 'Select product', 'id'=> 'product-select',
                 'class' => 'form-control text-center']
            ) ?>
        </div>
    </div>
    <div class="form-group">
        <?= Html::submitButton('Save', ['class' => 'btn btn-success']) ?>
    </div>
<?php ActiveForm::end(); ?>

<?php
$this->registerJs("
    // 监听门店选择变化
    $('#output-store').on('change', function() {
        var storeId = $(this).val();
        $('#product-select').empty().append('<option value=\"\">Select product</option>');
        
        if (storeId) {
            $.ajax({
                url: '" . Url::to(['get-products-by-store']) . "',
                type: 'GET',
                data: {store_id: storeId},
                success: function(data) {
                    // 遍历返回的产品数据,添加到下拉框
                    $.each(data, function(key, value) {
                        $('#product-select').append('<option value=\"' + key + '\">' + value + '</option>');
                    });
                }
            });
        }
    });
");
?>

步骤2:添加控制器动作

在对应控制器中新增处理AJAX请求的方法,返回指定门店的产品列表:

public function actionGetProductsByStore()
{
    Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    
    $storeId = Yii::$app->request->get('store_id');
    if (!$storeId) {
        return [];
    }
    
    // 权限控制:仅返回当前管理员所属门店的产品
    $products = Product::find()
        ->where([
            'store_id' => $storeId,
            'store_id' => Store::find()->select('store_id')->where(['manager_id' => Yii::$app->user->identity->id])
        ])
        ->asArray()
        ->all();
    
    // 整理为下拉框所需的键值对格式
    $result = [];
    foreach ($products as $product) {
        $result[$product['product_id']] = $product['product_name'];
    }
    
    return $result;
}

关键说明

  • 前端通过change事件监听门店选择,触发AJAX请求动态拉取对应产品,实时更新下拉框选项
  • 控制器返回JSON格式的产品键值对,确保前端可直接解析渲染
  • 保留权限控制逻辑,避免泄露当前管理员无权限的门店产品数据
  • 修正原代码中where方法的语法错误,Yii框架中where接收数组条件的格式为['字段名' => 值]

内容的提问来源于stack exchange,提问作者John Magaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 04:30:15