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

Yii2中Html::dropDownList二级联动问题求助

没问题,我帮你搞定Yii2里的二级联动下拉框!咱们一步步来解决这个问题:

第一步:修正第一个客户下拉框的代码

你当前的where条件写法有问题,我先帮你调整成正确的格式(假设你是按当前登录用户的公司筛选客户,如果不是可以按需修改),同时给下拉框加个ID方便后续JS操作:

<?= Html::dropDownList('customer_id', null, 
    ArrayHelper::map(
        Customers::find()
            ->where(['company_id' => Yii::$app->user->identity->company_id]) // 这里替换成你的实际筛选条件
            ->orderBy('name')
            ->all(), 
        'id', 
        'name'
    ), 
    [
        'prompt' => 'Select a User ...', 
        'class' => 'form-control', // 补全你的class属性
        'id' => 'customer-dropdown' // 新增ID用于JS监听
    ]
) ?>

第二步:渲染第二个关联下拉框

先渲染一个初始为空(带提示)的下拉框,同样给它加个ID:

<?= Html::dropDownList('related_item_id', null, [], [
    'prompt' => 'Select an item after choosing customer ...',
    'class' => 'form-control',
    'id' => 'related-dropdown'
]) ?>

第三步:添加前端AJAX联动逻辑

在视图文件的末尾(或者用Yii::$app->view->registerJs())添加JS代码,监听第一个下拉框的变化,动态请求并更新第二个下拉框:

// 监听客户下拉框的选择变化
$('#customer-dropdown').on('change', function() {
    const customerId = $(this).val();
    const relatedDropdown = $('#related-dropdown');

    // 如果未选择客户,重置第二个下拉框
    if (!customerId) {
        relatedDropdown.empty().append('<option value="">Select an item after choosing customer ...</option>');
        return;
    }

    // 发送AJAX请求获取关联数据
    $.ajax({
        url: '<?= Url::to(['/your-controller/get-related-items']) ?>', // 替换成你的控制器路由
        type: 'GET',
        data: { customer_id: customerId },
        dataType: 'json',
        success: function(data) {
            // 清空并初始化第二个下拉框
            relatedDropdown.empty().append('<option value="">Select an item ...</option>');
            
            // 遍历返回的数据添加选项
            $.each(data, function(id, name) {
                relatedDropdown.append(`<option value="${id}">${name}</option>`);
            });
        },
        error: function() {
            relatedDropdown.empty().append('<option value="">Failed to load items</option>');
        }
    });
});

第四步:后端添加处理AJAX请求的Action

在你的控制器(比如CustomerController或者专门的工具控制器)里添加一个Action,用于根据客户ID返回关联数据:

use Yii;
use yii\web\Response;
use app\models\YourRelatedModel; // 替换成你的关联模型(比如Orders/Projects等)

public function actionGetRelatedItems()
{
    // 设置响应格式为JSON
    Yii::$app->response->format = Response::FORMAT_JSON;

    $customerId = Yii::$app->request->get('customer_id');
    
    // 查询关联数据,这里假设关联表有`customer_id`字段,按需修改条件
    $relatedItems = YourRelatedModel::find()
        ->where(['customer_id' => $customerId])
        ->orderBy('name')
        ->all();

    // 转换成ID=>名称的键值对数组返回
    return \yii\helpers\ArrayHelper::map($relatedItems, 'id', 'name');
}

几个注意事项

  • 把YourRelatedModel替换成你实际的关联模型类(比如如果是客户的订单就用Orders)
  • 调整Url::to(['/your-controller/get-related-items'])中的your-controller为你实际的控制器ID(比如customer对应CustomerController)
  • 如果需要权限控制,记得在控制器的behaviors()方法中给这个Action添加访问规则
  • 测试时可以通过浏览器开发者工具查看AJAX请求的响应,确认数据是否正确返回

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:22:44