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

Sulu CMF如何实现关联实体过滤后的单选自动补全选择功能

解决步骤

  1. 后端实现过滤接口
    首先新增自定义接口,接收dataSetId和可选的excludeId参数,返回对应数据集下符合要求的DataGroup列表:
// src/Controller/Admin/DataGroupAutocompleteController.php
namespace App\Controller\Admin;

use App\Entity\DataGroup;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;

/**
 * @Route("/admin/api/data-groups", name="app_admin_data_groups_")
 */
class DataGroupAutocompleteController extends AbstractController
{
    /**
     * @Route("/autocomplete", name="autocomplete", methods={"GET"})
     */
    public function autocomplete(Request $request, EntityManagerInterface $em): JsonResponse
    {
        $dataSetId = $request->query->get('dataSetId');
        $excludeId = $request->query->get('excludeId');
        $search = $request->query->get('search', '');

        $qb = $em->getRepository(DataGroup::class)->createQueryBuilder('g')
            ->where('g.set = :dataSetId')
            ->setParameter('dataSetId', $dataSetId)
            ->andWhere('g.name LIKE :search')
            ->setParameter('search', '%' . $search . '%');

        if ($excludeId) {
            $qb->andWhere('g.id != :excludeId')
                ->setParameter('excludeId', $excludeId);
        }

        $groups = $qb->getQuery()->getResult();
        $result = array_map(fn(DataGroup $group) => [
            'id' => $group->getId(),
            'name' => $group->getName(),
        ], $groups);

        return new JsonResponse($result);
    }
}
  1. 配置表单字段
    如果使用JS手写表单,在DataGroup弹窗表单的schema配置中,给nextGroup字段做如下配置,动态传入当前所属的DataSet ID:
nextGroup: {
    label: '下一个分组',
    type: 'single_auto_complete',
    options: {
        url: '/admin/api/data-groups/autocomplete',
        parameters: {
            dataSetId: parentForm.get('id').data, // 按实际父表单取值逻辑调整
            excludeId: form.get('id').data ?? null
        },
        displayProperty: 'name',
        valueProperty: 'id',
    }
}

如果使用官方推荐的配置化实现,直接在表单配置文件中注入参数即可:

<!-- config/packages/sulu_admin.yaml 对应表单配置 -->
<property name="nextGroup" type="single_auto_complete">
    <meta>
        <title>下一个分组</title>
    </meta>
    <params>
        <param name="url" value="/admin/api/data-groups/autocomplete"/>
        <param name="parameters" type="expression" value="{dataSetId: parent.id, excludeId: id ?? null}"/>
        <param name="display_property" value="name"/>
        <param name="value_property" value="id"/>
    </params>
</property>
  1. 权限校验(可选)
    可以给控制器方法添加Sulu权限注解,限制只有拥有DataSet编辑权限的用户可调用该接口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:51:01