Symfony表单渲染时如何让数据库中为true的EntityType复选框默认选中
Symfony表单复选框根据数据库值默认选中的实现方法
Symfony表单组件默认自带数据映射能力,绝大多数场景不需要你手动通过choice_attr控制checked状态,只要做好配置就能自动匹配数据库存储的值,步骤如下:
- 表单创建时传入从数据库查询到的实体实例,示例控制器代码:
// 从数据库查询目标用户数据 $user = $this->getDoctrine()->getRepository(User::class)->find($userId); // 将实体实例传入表单生成方法 $form = $this->createForm(UserType::class, $user);
- 表单类中对应字段配置开启映射:保持
mapped参数为默认值true,且字段名和实体属性名一致即可。如果是角色类的多选字段,确保expanded和multiple都设为true,Symfony会自动将实体中存储的已选值和选项匹配,自动添加checked属性。
如果存在特殊场景需要手动通过choice_attr控制选中状态,可以通过$options['data']获取当前绑定的实体实例,再在闭包中判断当前选项是否属于已选范围,示例代码如下:
public function buildForm(FormBuilderInterface $builder, array $options) { // 获取当前绑定的用户实体(包含数据库存储的已选角色) $currentUser = $options['data']; $builder // 其余字段配置省略 ->add('roles', ChoiceType::class, [ 'choices' => [ '普通用户' => 'ROLE_USER', '管理员' => 'ROLE_ADMIN', '超级管理员' => 'ROLE_SUPER_ADMIN', ], 'expanded' => true, 'multiple' => true, 'choice_attr' => function ($roleValue, $key, $index) use ($currentUser) { // 判断当前选项值是否在用户已选角色列表中 return in_array($roleValue, $currentUser->getRoles()) ? ['checked' => true] : []; }, ]); }
注意:不需要返回
['checked' => false],未选中时返回空数组即可,避免部分浏览器出现解析异常。
内容的提问来源于stack exchange,提问作者Bradmage
相关产品推荐
相关产品推荐

