Sulu CMF如何实现关联实体过滤后的单选自动补全选择功能
解决步骤
- 后端实现过滤接口
首先新增自定义接口,接收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); } }
- 配置表单字段
如果使用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>
- 权限校验(可选)
可以给控制器方法添加Sulu权限注解,限制只有拥有DataSet编辑权限的用户可调用该接口。
内容的提问来源于stack exchange,提问作者Leon Willens
相关产品推荐
相关产品推荐

