2013-11-15 30 views
1

我嘗試通過重寫控制器和表單類型來顯示所選組中的角色,但我沒有找到正確的方法。我已經按照這些步驟來覆蓋所有的東西,這是有效的,但是當我試圖對服務傳遞給構造函數一個實體對象時,會出現問題。FOSUserBundle在編輯視圖中顯示組角色

由於formtype必須被覆蓋,如何通過您需要實現的服務,我的Group實體?

有沒有人有如何實現這個想法?

這裏是我做了什麼:

  1. 覆蓋控制器,並創建窗體時,通過$group實體

    $formFactory = $this->container->get('fos_user.group.form.factory'); 
    $form = $formFactory->createForm($group); //Here 
    
  2. 覆蓋的形式,並使用自定義__construct方法在那裏我可以通過我的實體(也許這裏是我的錯誤,應該做的更好或其他方式)

    public function __construct(Container $container, Groups $group) 
    { 
        $this->container = $container; 
        $this->roles = array_keys($this->container->getParameter('security.role_hierarchy.roles')); 
    
        $this->group = $group; #How? 
    } 
    

獲取角色密鑰的容器傳遞時沒有錯誤,可以正常工作。

  • 創建服務爲一體的文件說,(說到這裏真正的問題和例外)

  • 我真的堆疊與和唐我不知道如何繼續。

    回答

    4

    最後,重寫GroupController.php並增加一個選擇字段類型,我的表格後,我可以達到我的目標。

    $form->add('roles', 'choice', array(
           'choices' => $this->getExistingRoles(), 
           'data' => $group->getRoles(), 
           'label' => 'Roles', 
           'expanded' => true, 
           'multiple' => true, 
           'mapped' => true, 
          )); 
    

    凡getExistingRoles()是:

    $roleHierarchy = $this->container->getParameter('security.role_hierarchy.roles'); 
        $roles = array_keys($roleHierarchy); 
    
        foreach ($roles as $role) { 
         $theRoles[$role] = $role; 
        } 
        return $theRoles; 
    

    我只是在錯誤的方式去,它不是那麼難以得到一組的作用,並顯示在一個管理界面,使您可以選擇一個系統角色並將其提供給組。無需重寫FormType,只需將控件添加到表單中。

    希望它有幫助,因爲它給我很多頭痛。

    1

    您不應將實體傳遞給構造函數。如果您需要訪問窗體中的實體,您必須將事件偵聽器添加到表單生成器,像這樣:

    public function buildForm(FormBuilder $builder, array $options) 
    { 
        $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { 
         $form = $event->getForm(); 
         $entity = $event->getData(); 
    
         // This is your Group entity, now do something with it... 
         if ($entity instanceof Group) { 
          // $form->add ... 
         } 
        }); 
    } 
    
    +0

    FormEvents是一個Symfony FormEvents,而FormEvent是一個FOSUserBundle FormEvent? – agapitocandemor

    +1

    我認爲他們都是Symfony。 –