Sulu CMF:向FormOverlayList新增表单的自动完成字段传递dataSetId参数
解决Sulu中新建DataGroup时nextGroup自动完成无法获取dataSetId的问题
我之前在Sulu项目里遇到过几乎一模一样的问题,咱们一步步来拆解解决:
问题根源
你当前的核心问题是:新建DataGroup时,nextGroup的自动完成组件拿不到当前DataSet的dataSetId。因为新建状态下DataGroup还没关联到DataSet,你之前配置的resource_store_properties_to_request是取当前实体的id(也就是DataGroup的id),但这时候实体还不存在,自然传不出参数,导致API请求没有过滤条件,没法只搜索同DataSet下的其他组。
具体修复步骤
1. 修改DataGroup表单字段,从路由参数取dataSetId
更新forms/data_group.xml里的nextGroup字段配置,把依赖实体属性的resource_store_properties_to_request换成从路由参数获取的request_parameters:
<property name="nextGroup" type="single_data_group_selection"> <params> <param name="type" value="auto_complete"/> <param name="request_parameters" type="collection"> <param name="dataSetId" value="dataSetId"/> </param> </params> </property>
这样配置后,自动完成组件会直接从打开表单时的路由参数里提取dataSetId,不用依赖新建实体的属性。
2. 完善DataGroup列表API的过滤逻辑
在DataGroupController::cgetAction里,确保收到dataSetId时自动过滤出对应DataSet下的DataGroup,同时处理编辑场景下排除自身的约束:
public function cgetAction(Request $request): Response { $listBuilder = $this->listBuilderFactory->create(DataGroup::class); // 过滤当前DataSet下的组 if ($dataSetId = $request->query->get('dataSetId')) { $listBuilder->where('dataSet.id', $dataSetId); } // 编辑场景下排除当前组(满足nextGroup !== $this的约束) if ($currentGroupId = $request->query->get('id')) { $listBuilder->where('id', $currentGroupId, Comparison::NEQ); } $listResponse = $listBuilder->execute(); $list = new ListRepresentation( $listResponse, 'data_groups', $request->query->all(), $listBuilder->getCurrentPage(), $listBuilder->getLimit(), $listBuilder->count() ); return $this->handleView($this->view($list)); }
3. 修正Admin类里的表单配置细节
检查你的DataAdmin类,确保表单和资源的key对应正确,路由参数传递逻辑没问题:
$groupsFormOverlayList = $this->viewBuilderFactory ->createFormOverlayListViewBuilder(self::DATA_SET_EDIT_FORM_GROUPS, '/groups') ->setResourceKey('data_groups') // 对应sulu_admin.yaml里的资源key ->setListKey('data_groups') // 对应lists/data_groups.xml的key ->addListAdapters(['table']) ->addRouterAttributesToListRequest(['id' => 'dataSetId']) ->setFormKey('data_group') // 对应forms/data_group.xml的key ->addRouterAttributesToFormRequest(['id' => 'dataSetId']) ->setTabTitle('app.data_groups') ->addToolbarActions([ new ToolbarAction('sulu_admin.add'), new ToolbarAction('sulu_admin.delete') ]);
4. 修复sulu_admin.yaml里的路由拼写错误
注意你之前配置的data_groups资源里的detail路由拼写错了(写成了details),这会导致Sulu无法正确识别详情路由,修正后:
sulu_admin: resources: data_sets: routes: list: app.get_data_sets detail: app.get_data_set data_groups: routes: list: app.get_data_groups detail: app.get_data_group # 这里修正为detail,不是details field_type_options: single_selection: single_data_group_selection: default_type: 'auto_complete' resource_key: 'data_groups' types: auto_complete: display_property: 'name' search_properties: - 'name'
验证效果
完成所有修改后,打开DataSet编辑页的DataGroup标签页:
- 点击新建按钮打开DataGroup表单
- 点击
nextGroup输入框,检查浏览器网络请求,确认dataSetId参数已经带上 - 验证返回的选项都是当前DataSet下的DataGroup,编辑现有组时不会显示自身
内容的提问来源于stack exchange,提问作者Leon Willens
相关产品推荐
相关产品推荐

