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对象被错误当作字符串处理,结合代码来看,主要问题点和修复方式如下:
模型字段不匹配
控制器中DynamicModel定义的字段是['campus', 'program'],但视图表单字段用的是college_id和program_id,字段名不对应导致ActiveForm渲染出错。
修复:修改DynamicModel字段与视图一致:'model' => new \yii\base\DynamicModel(['college_id', 'program_id']),Select2配置错误
Yii2原生Select2扩展不支持depends和url自动联动配置,你已自定义JS联动逻辑,这些配置会引发内部处理异常。
修复:移除pluginOptions中的depends和url项。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: []}); } }); ');表单未闭合
视图调用ActiveForm::begin()后未调用ActiveForm::end(),导致HTML结构不完整,引发对象转换错误。
修复:在视图代码末尾添加:ActiveForm::end();
额外检查项
- 确保
common/list_program_curry_bycampuss动作返回标准JSON格式,结构应为[{id: "专业ID", text: "专业名称"}, ...] - 确认
TblCollege的name字段是校区唯一标识,与AJAX请求传递的collegeId值匹配
内容的提问来源于stack exchange,提问作者Ezekiel Leo
相关产品推荐
相关产品推荐

