如何在使用Symfony构建的表单中禁用相关实体的选择字段


How to disable the select field of a related entity in a form built using Symfony?

我的Symfony应用程序中有两个实体:用户和学生具有一对一的关系。

我正在制作一个创建学生记录的表单,该记录也将数据插入用户表中。

我已经成功创建了表单。用户实体具有角色属性(指角色实体),该属性按预期呈现为选择字段。

我想禁用此角色选择字段,以便在添加新学生时仅选择一个选项。我怎样才能做到这一点?

只需将"disabled" => true添加到用户表单类型特定角色字段的设置数组中即可。

为了使其"更安全",您可以通过添加自定义查询生成器方法来筛选现有角色的整个列表。如果仅选择适合当前用户实际角色的单行,则选择将只有一个选项可供选择。因此,即使有人能够修改html代码,也只有合适的角色。

'query_builder' => function (EntityRepository $er) {
    return $er->createQueryBuilder('r')
        ->where('r.id = :role')
        ->setParameter(':role', $currentUsersRole);
},
<</div> div class="answers">

我通过从控制器中删除角色字段,然后在保存记录时自己设置角色的值来解决此问题。见下文;

$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);