2013-10-24 73 views
3

该问题与this one类似,但是存在巨大差异:我没有固定数量的要添加的元素。Symfony 2.3.6。嵌套形式

下面是窗体的预览以及窗体的外观。我有一个用户实体的表格,其中包括不同的应用实体,每个应用实体有几个用户组实体

The way my form should look like - nested entities

用户

class User extends BaseUser 
{ 
... 

/** 
* @ORM\ManyToMany(targetEntity="Application", inversedBy="users") 
* @ORM\JoinTable(name="users_applications") 
*/ 
protected $applications; 

/** 
* @ORM\ManyToMany(targetEntity="UserGroup", inversedBy="users") 
* @ORM\JoinTable(name="users_groups") 
*/ 
protected $user_groups; 

应用

class Application 
{ 
... 

/** 
* @ORM\ManyToMany(targetEntity="User", mappedBy="applications") 
*/ 
protected $users; 

/** 
* @ORM\OneToMany(targetEntity="UserGroup", mappedBy="application") 
*/ 
protected $user_groups; 

用户组

class UserGroup 
{ 
... 

/** 
* @ORM\ManyToOne(targetEntity="Application", inversedBy="user_groups") 
* @ORM\JoinColumn(name="application_id", referencedColumnName="id") 
*/ 
protected $application; 

/** 
* @ORM\ManyToMany(targetEntity="User", mappedBy="user_groups") 
*/ 
protected $users; 

UserFormType

class UserFormType extends AbstractType 
{ 
    // Array of applications is generated in the Controller and passed over by the constructor 
    private $applications; 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    ... 

    if ($this->applications && count($this->applications) > 0) 
    { 
     foreach ($this->applications AS $application) 
     { 
      $builder->add('applications', 'entity', array 
      (
       'class' => 'MyBundle:Application', 
       'property' => 'title', 
       'query_builder' => function(EntityRepository $er) use ($application) 
       { 
        return $er->createQueryBuilder('a') 
         ->where('a.id = :id') 
         ->setParameter('id', $application->getId()); 
       }, 
       'expanded' => true, 
       'multiple' => true 
      )); 

      $builder->add('user_groups', 'entity', array 
      (
       'class' => 'MyBundle:UserGroup', 
       'property' => 'title', 
       'query_builder' => function(EntityRepository $er) use ($application) 
       { 
        return $er->createQueryBuilder('ug') 
         ->where('ug.application = :application') 
         ->setParameter('application', $application); 
       }, 
       'expanded' => true, 
       'multiple' => true 
      )); 
     } 
    } 
... 

问题:我已经设法包括应用用户组实体,但由于应用实体通过加入formbuilder循环中,实体被覆盖,使得多个应用程序只有一个应用程序被渲染。

+2

我们对嵌套表单有一些类似的设置,但我们使用集合,也许它可以成为您的问题的解决方案! http://symfony.com/doc/current/cookbook/form/form_collections.html – acrobat

+0

您在每次迭代中添加相同的字段(名称应用程序)。这是不可能的。我建议为实体子类型创建特殊类型 – zulus

回答

4

你确实需要收藏品。集合允许任意数量的元素(符合您的要求)。我认为问题是你应该有一个UserGroupType,这样收藏的方式就是你想要的。

这里或多或少是您的表单类型的完整示例。命名空间和其他东西被省略。

控制器(记住,你是路过的User对象的形式,不做你private $applications在做什么):

... 
$user = ...; 
$form = $this->createForm(new UserFormType(), $user); 

更改UserFormType:

class UserFormType extends AbstractType 
{ 
    // Don't have that $applications member here... 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     //... 

     // Your user has many UserGroups, so display each one as a UserGroup field (see UserGroupFormType) 
     $builder->add('user_groups', 'collection', array(
      'type' => new UserGroupFormType() // I would make this type a service (http://symfony.com/doc/current/book/forms.html#defining-your-forms-as-services) 
     )); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Namespace\Entity\User' 
     )); 
    } 

    // ... getname, etc. 
} 

New UserGroupFormType:

class UserGroupFormType extends AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     // Each UserGroup has 1 application and multiple users 
     // The entity fields allow you to select these 

     $builder->add('application', 'entity', array 
     (
      'class' => 'MyBundle:Application', 
      'property' => 'title', 
      'query_builder' => function(EntityRepository $er) use ($application) 
      { 
       return $er->createQueryBuilder('a') 
        ->where('a.id = :id') 
        ->setParameter('id', $application->getId()); 
      }, 
      'expanded' => true, 
      'multiple' => false 
     )); 

     $builder->add('users', 'entity', array 
     (
      'class' => 'MyBundle:User', 
      'property' => 'title', 
      'query_builder' => function(EntityRepository $er) use ($application) 
      { 
       return $er->createQueryBuilder('ug') 
        ->where('ug.application = :application') 
        ->setParameter('application', $application); 
      }, 
      'expanded' => true, 
      'multiple' => true 
     )); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Namespace\Entity\UserGroup' 
     )); 
    } 

    // ... getname, etc. 
} 

另请参阅http://symfony.com/doc/current/cookbook/form/form_collections.html 这说明如何处理在表单中添加新的用户组(如果需要该功能)。

+0

感谢您的努力!你的解决方案中的问题是,我不会得到我想要的分层结构:1. application1; 1.1。 1组; 1.2。第2组; 2. application2等第二件事是我编辑用户实体,我想选择应用程序/组 - 在您的解决方案中,我将编辑usergroup实体。同时,我将实体分配分成几种形式 - 但我会将您的答案标记为已接受。 – Vilius