2013-01-10 85 views
4

我在創建symfony 2 + FOSUserBundle中的新/編輯用戶表單時遇到了問題。我想啓用管理員從下拉列表或單選按鈕列表中選擇用戶角色,但似乎無法使其工作。我在這裏找到了這個答案How can I pass a full security roles list/hierarchy to a FormType class in Symfony2?這是我能找到的最相關的東西,但它不起作用。如何使用表單在symfony 2中編輯用戶權限?

這是UserType形式,因爲它目前代表。我想從容器中獲取角色,但是我似乎無法在沒有拋出錯誤的情況下工作。這些角色將正確填充下拉菜單,但不會顯示當前分配的角色,也不會允許更新信息,因爲它預期它是一個數組$entity->addRoles(array('ROLE_SUPER_ADMIN'));,但它只是以字符串形式提交。

namespace Wes\AdminBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class UserType extends AbstractType 
{ 
    private $roles; 

    public function __construct($roles) { 
     $this->roles = $roles; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('username') 
      ->add('email') 
      ->add('enabled') 
      ->add('roles', 'choice', array(
       'choices' => $this->flattenArray($this->roles), 
      )) 
      ->add('firstName') 
      ->add('lastName') 
     ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Wes\AdminBundle\Entity\User', 
      'roles' => null, 
      'userRole' => null, 
     )); 
    } 

    public function getName() 
    { 
     return 'wes_adminbundle_usertype'; 
    } 

    private function flattenArray(array $data) 
    { 
     $returnData = array(); 

     foreach($data as $key => $value) 
     { 
      $tempValue = str_replace("ROLE_", '', $key); 
      $tempValue = ucwords(strtolower(str_replace("_", ' ', $tempValue))); 
      $returnData[$key] = $tempValue; 
     } 
     return $returnData; 
    } 
} 

這是控制器。

public function editAction($id) 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $entity = $em->getRepository('WesAdminBundle:User')->find($id); 
    if (!$entity) { 
     throw $this->createNotFoundException('Unable to find User entity.'); 
    } 

    $editForm = $this->createForm(new UserType($this->container->getParameter('security.role_hierarchy.roles')), $entity); 
    $deleteForm = $this->createDeleteForm($id); 

    return $this->render('WesAdminBundle:User:edit.html.twig', array(
     'entity'  => $entity, 
     'edit_form' => $editForm->createView(), 
     'delete_form' => $deleteForm->createView(), 
    )); 
} 

/** 
* Edits an existing User entity. 
* 
*/ 
public function updateAction(Request $request, $id) 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $entity = $em->getRepository('WesAdminBundle:User')->find($id); 

    if (!$entity) { 
     throw $this->createNotFoundException('Unable to find User entity.'); 
    } 

    $deleteForm = $this->createDeleteForm($id); 
    $editForm = $this->createForm(new UserType($this->container->getParameter('security.role_hierarchy.roles')), $entity); 
    $editForm->bind($request); 

    if ($editForm->isValid()) { 
     $em->persist($entity); 
     $em->flush(); 

     return $this->redirect($this->generateUrl('wes_admin_user_edit', array('id' => $id))); 
    } 

    return $this->render('WesAdminBundle:User:edit.html.twig', array(
     'entity'  => $entity, 
     'edit_form' => $editForm->createView(), 
     'delete_form' => $deleteForm->createView(), 
    )); 
} 

我一直在爲此奮戰了幾天,現在我似乎無法讓它正常工作。有什麼想法嗎?

+0

當您嘗試從容器中檢索角色時,會出現什麼錯誤? (security.role_hierarchy.roles) – Mike

+0

它告訴我,我正在調用一個非對象的方法。但我認爲這與使用containerAwareInterface的方法有關。 – JeremyC

回答

3

使用由FOSUserBundle提供的userManager而不是自定義持久性方法,因爲角色數組在存儲到數據庫之前需要序列化。

$userManager = $this->container->get('fos_user.user_manager'); 
$user = $userManager->findUserBy(array('id' => $id)); 

$editForm = $this->createForm(new UserType($this->container->getParameter('security.role_hierarchy.roles')), $user); 

if ($editForm->isValid()) { 
    $userManager->updateUser($user); 

    return $this->redirect($this->generateUrl('wes_admin_user_edit', 
     array('id' => $id))); 
} 

請參閱https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/user_manager.rst(編輯)瞭解更多信息。

+1

這很好,謝謝。 – JeremyC

相關問題