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

Yii2 PHP网站下拉框联动实现报错及功能需求咨询

Yii2 下拉框联动报错:Object of class yii\widgets\ActiveForm could not be converted to string

我在Yii2 PHP网站上实现两个下拉框联动功能,期望选择校区后第二个下拉框自动加载对应专业数据,但出现报错:Object of class yii\widgets\ActiveForm could not be converted to string。以下是相关代码片段:

控制器代码

$campusList = ArrayHelper::map(TblCollege::find()->all(), 'name', 'name');
return $this->render('view_probation', [
    'model' => new \yii\base\DynamicModel(['campus', 'program']),
    // 'model' => $model,
    'collegeList' => $campusList,
]);

视图代码

$form = ActiveForm::begin();
echo $form->field($model, 'college_id')->widget(Select2::classname(), [
    'data' => $collegeList,
    'options' => ['placeholder' => 'Select a college', 'id' => 'college_id'],
    'pluginOptions' => [
        'allowClear' => true,
    ],
]);

// Second Select2 for Programs
echo $form->field($model, 'program_id')->widget(Select2::classname(), [
    'options' => ['placeholder' => 'Select a program', 'id' => 'program_id'],
    'pluginOptions' => [
        'allowClear' => true,
        'depends' => ['college_id'],
        'url' => Url::to(['common/list_program_curry_bycampuss']),
    ],
]);

JavaScript代码

$this->registerJs('
    // JavaScript to hide the loader initially
    $("div#loader").hide();

    $("#college_id").on("change", function() {
        var collegeId = $(this).val();
        if (collegeId) {
            $.ajax({
                url: "' . Url::to(['common/list_program_curry_bycampuss']) . '",
                type: "GET",
                data: {collegeId: collegeId},
                success: function(data) {
                    // Parse the received JSON data
                    var programsData = JSON.parse(data);

                    // Convert data to the format expected by Select2
                    var options = programsData.map(function(item) {
                        return {id: item.id, text: item.text};
                    });

                    // Populate the program dropdown
                    $("#program_id").html("").select2({data: options});
                }
            });
        } else {
            // Reset program dropdown if college is not selected
            $("#program_id").html("").select2({data: {}});
        }
    });
');

问题分析与修复方案

这个报错的核心是ActiveForm对象被错误当作字符串处理,结合代码来看,主要问题点和修复方式如下:

  1. 模型字段不匹配
    控制器中DynamicModel定义的字段是['campus', 'program'],但视图表单字段用的是college_id和program_id,字段名不对应导致ActiveForm渲染出错。
    修复:修改DynamicModel字段与视图一致:

    'model' => new \yii\base\DynamicModel(['college_id', 'program_id']),
    
  2. Select2配置错误
    Yii2原生Select2扩展不支持depends和url自动联动配置,你已自定义JS联动逻辑,这些配置会引发内部处理异常。
    修复:移除pluginOptions中的depends和url项。

  3. JavaScript转义错误
    registerJs中使用"转义引号多余,会导致JS解析异常。
    修复:使用正常引号嵌套,同时优化JSON解析逻辑:

    $this->registerJs('
        // 初始隐藏加载器
        $("div#loader").hide();
    
        $("#college_id").on("change", function() {
            var collegeId = $(this).val();
            if (collegeId) {
                $.ajax({
                    url: "' . Url::to(['common/list_program_curry_bycampuss']) . '",
                    type: "GET",
                    data: {collegeId: collegeId},
                    dataType: "json", // 直接指定返回JSON,无需手动解析
                    success: function(programsData) {
                        // 转换为Select2需要的格式
                        var options = programsData.map(function(item) {
                            return {id: item.id, text: item.text};
                        });
    
                        // 填充专业下拉框
                        $("#program_id").html("").select2({data: options});
                    }
                });
            } else {
                // 未选择校区时重置下拉框
                $("#program_id").html("").select2({data: []});
            }
        });
    ');
    
  4. 表单未闭合
    视图调用ActiveForm::begin()后未调用ActiveForm::end(),导致HTML结构不完整,引发对象转换错误。
    修复:在视图代码末尾添加:

    ActiveForm::end();
    

额外检查项

  • 确保common/list_program_curry_bycampuss动作返回标准JSON格式,结构应为[{id: "专业ID", text: "专业名称"}, ...]
  • 确认TblCollege的name字段是校区唯一标识,与AJAX请求传递的collegeId值匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 01:15:04