質問

選択したグループからの役割を表示するには、コントローラとFormTypeを上書きすることを試みますが、正しい方法は見つかりません。私はすべてをオーバーライドするためのステップを続けました、それは動作しますが、私がコンストラクトオブジェクトを渡すサービスに言うときに問題が生まれます。

FormTypeを上書きする必要があるため、実装に必要なサービスを通過させる方法、マイグループエンティティ?

誰もがそれを達成する方法を考えていますか?

これは私がやったことです:

  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? 
    }
    
  3. 役割のキーを取得するためのコンテナはエラーなしで渡され、それは機能します。

    1. ドキュメントとしてサービスを作成する(ここでは本当の問題と例外があります)

       x_s_cosmos.group.form.type:
          class: X\S\CosmosBundle\Form\Type\GroupFormType
          arguments: [@service_container, here_should_be_my_entity?]
          tags:
              - { name: form.type, alias: kosmos_group_form }
      
    2. 私は本当にそれと積み上げられており、その上に行く方法を考えていません。

役に立ちましたか?

解決

最後に、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;
.

私は間違った方法で行くだけで、グループの役割を取得して管理インターフェースに表示することはそれほど難しくありませんでしたので、システムの役割の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 ...
        }
    });
}
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top