使用表单类型实体设置symfony2表单的选定值

时间:2015-08-17 11:40:46

标签: symfony

我的symfony2应用程序中有一个名为User的实体。我使用“创建表单构建器”在控制器中创建了一个表单。

我在控制器中的代码如下:

$user = new User();

    $form = $this->createFormBuilder($user);

        $resultForm = $form->add('username')
                ->setAction($this->generateUrl('usermanagement_create'))
                ->setMethod('POST')
                ->add('email')
                ->add('roles', 'entity', array(
                    'class' => 'PortalBundle\Entity\Roles',
                    'expanded' => true,
                    'multiple' => true,
                    'required' => false,
                    'constraints' => array(
                        new NotBlank(),
                    ),
                ))
                ->getForm()
        ;

我必须渲染表单,因为选择了一些值作为字段角色的默认值。

1 个答案:

答案 0 :(得分:1)

我可以建议将表单创建为Your/Bundle/Path/Form/YourFormType吗? 这样你的表单几乎可以在任何地方使用,如果你需要它,你可以简单地调用它。而且,你的控制器会很干净。

写下解决方案,你可以用不同的方式进行

  1. 设置empty_data属性
  2. 明确将角色设置为对象
  3. empty_data explainination

    您需要注入(如果您将表单定义为服务)或传递(如果您为表单定义外部类)或使用(在您的情况下)和实体管理器来检索默认选择对象。我将根据您的代码段向您展示一个解决方案

    $em = $this
        ->getDoctrine()
        ->getManager();
    
    $user = new User();
    $form = $this->createFormBuilder($user);
    $resultForm = $form
        ->add('username')
        ->setAction($this->generateUrl('usermanagement_create'))
        ->setMethod('POST')
        ->add('email')
        ->add('roles', 'entity', array(
            'class' => 'PortalBundle\Entity\Roles',
            'empty_data' => $em->getReference("PortalBundle:Roles", //put here pk to retrieve default role)
            'expanded' => true,
            'multiple' => true,
            'required' => false,
            'constraints' => array(
                new NotBlank(),
            ),
        ))
        ->getForm();
    

    如果您需要多个角色,请编写一个查询以返回它们并传递给empty_data

    明确设置角色

    $em = $this
        ->getDoctrine()
        ->getManager();
    
    $user = new User();
    $default_roles = $em
        ->getRepository("Path/To/Roles/Repo")
        ->findDefaults(); //maybe a method you need to implement
    $user->setRoles($default_roles);
    //and leave form code as is