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

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标签页:

  1. 点击新建按钮打开DataGroup表单
  2. 点击nextGroup输入框,检查浏览器网络请求,确认dataSetId参数已经带上
  3. 验证返回的选项都是当前DataSet下的DataGroup,编辑现有组时不会显示自身

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 10:02:36