2015-12-05 67 views
0

我正在創建一個Web界面,允許用戶在CentOS 6.x上分配https://github.com/FriendsOfSymfony/FOSUserBundle和Symfony版本2.7。FOSUserBundle - UserType形式的組賦值

這是我的代碼:我讀過的Symfony和Google搜索的文檔

use FOS\UserBundle\Model\GroupManager; 
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 

/** 
* @Route("/admin/user") 
*/ 
public function indexAction(Request $request) 
{ 
    $this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Unable to access this page!'); 

    $groups = $this->get('fos_user.group_manager')->findGroups(); 
    $groupNames = []; 
    foreach ($groups as $g) { 
     $groupNames[] = $g->getName(); 
    } 

    $user = new User(); 
    $user_form = $this->createForm(new UserType(), $user); 
    $user_form->add('groups', ChoiceType::class, [ 
     'choices' => $groupNames, 
     'choices_as_values' => true, 
     'multiple' => false 
    ]); 

    return $this->render('admin/user/index.html.twig', array(
       'user_form' => $user_form->createView(), 
       'base_dir' => realpath($this->container->getParameter('kernel.root_dir') . '/..'), 
      )); 
} 

,但調試器拋出一個錯誤(未能加載類型「的Symfony \分量\表格\推廣\ Core \ Type \ ChoiceType「)。

我有兩個問題:

  1. 我如何添加一個選擇字段成允許用戶選擇哪個組將用戶分配到表單?

  2. 將組選擇元素添加到UserType中會更好嗎?

這就是我對用戶類型(從下面的Symfony的文檔):

class UserType extends AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
       ->add('username') 
       ->add('email') 
       ->add('enabled', 'checkbox') 
       ->add('locked', 'checkbox') 
       ->add('expired', 'checkbox') 
       ->add('credentialsExpired', 'checkbox') 
     ; 
    } 

謝謝@hendrathings爲提供更好的解決方案比我早。

我升級到Symfony 3.0以避免將來版本問題。

這是我終於實現:

UserType.php

// Additional dependencies ... 

use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 

class UserType extends AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $data) 
    { 
     $builder 
       ->add('username', TextType::class) 
       ->add('email', TextType::class) 
       ->add('enabled', CheckboxType::class) 
       ->add('locked', CheckboxType::class) 
       ->add('groups', ChoiceType::class, [ 
        'choices' => $data['group_names'], 
       ]); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\User', 
      'group_names' => [] 
     )); 
    } 

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

} 

它是由控制器稱爲像這樣:

$groups = $this->get('fos_user.group_manager')->findGroups(); 
    $groupNames = []; 
    foreach($groups as $g) 
    { 
     $groupNames[$g->getName()] = $g->getId(); 
    } 
    $user = new User(); 
    $user_form = $this->createForm(UserType::class, $user, array('group_names' => $groupNames)); 

這也是有幫助的:Pass custom options to a symfony2 form

我對我的實施並不滿意,但我認爲我現在就離開,繼續前進。

回答

1

你的symfony版本是2.7,你使用symfony 3.0語法。嘗試升級您的symfony composer

或將此零件更改爲ChoiceType::classchoice。並刪除use Symfony\Component\Form\Extension\Core\Type\ChoiceType

我1.How可以添加一個選擇字段成允許用戶選擇哪個組來分配用戶到窗體:

  • User實體類添加新字段group
  • 添加_constructUserType表明您的group列表(陣列)
  • UserType表格中添加新字段group。並呼籲$this->group$this->createForm(new UserType(), $user);設置choiceType
  • 修改controller$this->createForm(new UserType($group), $user);

所以你的用戶類型是:

private $group; 

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

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
      ->add('username') 
      ... 
      ->add('group', 'choice', array(
       'choice' => $this->group 
       ... // Your setting 
      )) 
    ; 
} 

打電話給你的形式控制器:

$this->createForm(new UserType($group), $user); 
  • 是的。讓你的代碼乾淨和理解。
  • +0

    謝謝@hendrathings - 你讓我學到了很多 – user2182349

    0

    這是我現在工作的解決方案。

    控制器

    public function indexAction(Request $request) 
    { 
        $this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Unable to access this page!'); 
    
        $user_form = $this->createForm(UserType::class, null, []); 
    
        return $this->render('admin/index.html.twig', array(
           'user_form' => $user_form->createView(), 
           'base_dir' => realpath($this->container->getParameter('kernel.root_dir') . '/..'), 
          )); 
    }  
    

    用戶類型/表

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
    
        $builder 
          ->add('username', TextType::class) 
          ->add('email', TextType::class) 
          ->add('enabled', CheckboxType::class) 
          ->add('locked', CheckboxType::class) 
          ->add('groups', EntityType::class, [ 
           'class' => 'AppBundle:Group', 
           'choice_label' => 'name', 
           'multiple' => true, 
           'choices_as_values' => true, 
           'expanded' => true 
          ]); 
    } 
    
    public function configureOptions(OptionsResolver $resolver) 
    { 
        $resolver->setDefaults(array(
         'groups' => [], 
         'data_class' => 'AppBundle\Entity\User' 
        )); 
    }