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

时间:2016-02-09 17:18:54

标签: php symfony twig entity symfony-forms

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

我正在创建一个表单来创建学生记录,这些记录也会将数据插入到用户表中。

我已成功创建form。用户实体具有角色属性(指代角色实体),其按预期呈现为选择字段。

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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