如何在使用 Symfony 构建的表单中禁用相关实体的 select 字段?
How to disable the select field of a related entity in a form built using Symfony?
我的 Symfony 应用程序中有两个实体;具有一对一关系的用户和学生。
我正在制作一个用于创建学生记录的表格,该表格还将向用户插入数据 table。
我已成功创建 form。用户实体有一个角色 属性(指角色实体),它按预期呈现为 select 字段。
我想禁用此角色 select 字段,以便在添加新学生时只有一个选项 selected。我怎样才能做到这一点?
只需将 "disabled" => true
添加到用户表单类型特定角色字段的设置数组中。
要实现 "more safe",您可以通过添加自定义查询生成器方法来过滤现有角色的整个列表。如果您 select 只有适合当前用户实际角色的一行,则 select 将只有一个选项可以 selected。因此,即使有人能够修改 html 代码,也只有合适的角色。
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('r')
->where('r.id = :role')
->setParameter(':role', $currentUsersRole);
},
我通过从控制器中删除角色字段然后在保存记录时自己设置角色的值来解决这个问题。见下文;
$student = new Student();
$form = $this->createForm('ReadathonBundle\Form\StudentType', $student);
$form->all();
$userForm = $form->get('user');
$userForm->remove('roleId');
// remove role field because we don't the user to be able to select this, we'll set this later
$form->remove('roleId');
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$user = $student->getUser();
// set role to student
$studentRole = $em->getRepository('ReadathonBundle:Role')->find(Role::STUDENT);
$user->setRole($studentRole);
我的 Symfony 应用程序中有两个实体;具有一对一关系的用户和学生。
我正在制作一个用于创建学生记录的表格,该表格还将向用户插入数据 table。
我已成功创建 form。用户实体有一个角色 属性(指角色实体),它按预期呈现为 select 字段。
我想禁用此角色 select 字段,以便在添加新学生时只有一个选项 selected。我怎样才能做到这一点?
只需将 "disabled" => true
添加到用户表单类型特定角色字段的设置数组中。
要实现 "more safe",您可以通过添加自定义查询生成器方法来过滤现有角色的整个列表。如果您 select 只有适合当前用户实际角色的一行,则 select 将只有一个选项可以 selected。因此,即使有人能够修改 html 代码,也只有合适的角色。
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('r')
->where('r.id = :role')
->setParameter(':role', $currentUsersRole);
},
我通过从控制器中删除角色字段然后在保存记录时自己设置角色的值来解决这个问题。见下文;
$student = new Student();
$form = $this->createForm('ReadathonBundle\Form\StudentType', $student);
$form->all();
$userForm = $form->get('user');
$userForm->remove('roleId');
// remove role field because we don't the user to be able to select this, we'll set this later
$form->remove('roleId');
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$user = $student->getUser();
// set role to student
$studentRole = $em->getRepository('ReadathonBundle:Role')->find(Role::STUDENT);
$user->setRole($studentRole);