ATK4(Agile Toolkit)PHP无表单提交实现下拉字段联动及报错解决
atk4下拉表单联动问题解决
错误原因
你遇到的报错直接原因是atk4\ui\FormField\DropDown类本身没有dependency这个原生配置属性,你直接将该参数写入字段配置数组,框架检测到未定义属性就抛出了异常。
同时你的实现逻辑存在两个问题:
- 字段配置数组结构错误,
dropdownOptions被额外套了一层无键嵌套数组,会导致配置不生效 - 无提交的表单联动是前端事件+后端异步请求配合实现的,不能仅靠后端闭包完成
修复方案
步骤1:修正字段基础定义
先移除无效的dependency配置,调整数组层级:
// 修正field1配置 $form->addField('field1', [ 'caption' => 'Field 1', 'type' => 'DropDown', 'values' => $arra1, 'isMultiple' => true, 'readonly' => false, 'dropdownOptions' => ['fullTextSearch' => true] ]); // 先定义field2,移除不存在的dependency配置 $field2 = $form->addField('field2', [ 'caption' => '选择指定值', 'type' => 'DropDown', 'isMultiple' => true, 'readonly' => false, 'dropdownOptions' => ['fullTextSearch' => true] ]);
步骤2:新增异步回调实现联动
通过atk4的jsCallback实现前端事件触发后端查询,动态更新field2选项:
// 新增异步回调,根据field1的值查询field2的可选选项 $cb = $form->add('jsCallback'); $cb->set(function($j, $field1_val) use ($db, $field2) { $model = new view_values($db); $field1_arr = json_decode($field1_val, true); if (!empty($field1_arr)) { // 因为field1是多选,这里用in条件匹配,如果你需要模糊匹配可自行调整条件逻辑 $model->addCondition($model->fieldName()->id, 'in', $field1_arr); } $options = []; foreach ($model as $item) { $options[] = [ 'id' => $item->id, 'name' => $item->getTitle() // 换成你实际要显示的字段名 ]; } // 返回js指令更新field2的下拉选项 return $j($field2)->dropdown('change values', $options); }); // 给field1绑定值变化事件,选中值变更时触发异步回调 $form->getField('field1')->on('change', $cb, [ // 多选场景下将选中值转成json传给后端 (new \atk4\ui\jsExpression('JSON.stringify([])'))->getInput($form->getField('field1')->jsInput->val()) ]);
注意事项
- 如果你的业务逻辑需要模糊匹配而非精确匹配id,可自行调整回调中的查询条件,不要直接拼接
%到参数中,避免SQL注入风险 - 代码中
getTitle()是模型默认的显示字段方法,如果你的模型要显示的是其他字段,直接换成对应字段取值即可
内容的提问来源于stack exchange,提问作者Magic Test
相关产品推荐
相关产品推荐

