从管理面板编辑用户角色(Symfony2和FOSUserBundle)


Edit user role from an admin panel (Symfony2 and FOSUserBundle)

我已经用自制的LDAP控制器完全设置了FOSUserBundle,该控制器允许用户使用Active Directory中已有的登录名登录。

我想要的是允许管理员从后端编辑任何用户角色。知道我该怎么做吗?(我不想使用SonataBundle)。

我已经制作了FormType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $permissions = array(
        'ROLE_USER'        => 'Aucun droit',
        'ROLE_CONSULT'     => 'Consultation',
        'ROLE_SUPER_ADMIN' => 'Administrateur'
    );
    $builder
        ->add(
            'id',
            'entity',
            array(
                'class'    => 'MainBundle:Users',
                'property' => 'displayName',
                'label'    => 'Choisir l''utilisateur',
                'attr'     => array(
                    'class' => "select2"
                )
            )
        )
        ->add(
            'role',
            'choice',
            array(
                'label'   => 'Rôle à attribuer',
                'choices' => $permissions,
                'attr'    => array(
                    'class' => "select2"
                )
            )
        )
        ->add(
            'save',
            'submit',
            array(
                'label' => 'Sauvegarder',
                'attr'  => array(
                    'class' => 'btn'
                )
            )
        );
}

还有控制器,这是我真正不确定的,因为我不知道什么时候选择指定的用户进行编辑:

public function editUserAction(Request $request)
{
    $request = $this->container->get('request');
    $editUser = $this->getDoctrine()->getRepository('MainBundle:Users')->findAll();
    $formEditUser = $this->createForm(new ChangeUserRoleType(), $editUser);
    $formEditUser->handleRequest($request);
    if ($formEditUser->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($editUser);
        $em->flush();
        return $this->render(
            'ReportingAdminBundle:Admin:index.html.twig',
            array(
                'editUserForm' => $formEditUser->createView()
            )
        );
    }
    return $this->render(
        'ReportingAdminBundle:Admin:index.html.twig',
        array(
            'editUserForm' => $formEditUser->createView()
        )
    );
}

好吧,我解决了这个问题。

表单的BuildForm:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $permissions = array(
        'ROLE_USER'        => 'First role',
        'ROLE_CONSULT'     => 'Second role',
        'ROLE_SUPER_ADMIN' => 'Third role'
    );
    $builder
        ->add(
            'id',
            'entity',
            array(
                'class'    => 'MainBundle:Users',
                'property' => 'displayName',
                'label'    => 'Choose the user',
            )
        )
        ->add(
            'role',
            'choice',
            array(
                'label'   => 'Choose the role',
                'choices' => $permissions,
            )
        )
        ->add(
            'save',
            'submit'
        );
}

控制器上的功能:

public function editRoleAction(Request $request)
{
    $request = $this->container->get('request');
    $formEditUser = $this->createForm(new ChangeUserRoleType());
    $formEditUser->handleRequest($request);
    if ($formEditUser->isValid()) {
        // Getting the variable of the form
        $selectedUser = $request->request->get('value');
        // Getting the user infos
        $editUser = $this->getDoctrine()->getRepository('MainBundle:Users')->find($selectedUser);
        // Using the UserManager (from the FOSUserBundle)
        $userManager = $this->container->get('fos_user.user_manager');
        $user = $userManager->findUserByUsername($editUser->getUsername());
        // Changing the role of the user
        $user->setRoles(array($selectedUser['role']));
        // Updating the user
        $userManager->updateUser($user);
    }
    return $this->render(
        'ReportingAdminBundle:Admin:index.html.twig',
        array(
            'editUserForm' => $formEditUser->createView()
        )
    );
}

我相信,如果你愿意,你可以调整它来添加更多的角色,比如在选择字段上将选项"multiple"设置为"true"。

我希望我能帮助任何有同样问题的人!