2013-10-24 2 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

우리는 중첩 된 양식을위한 일종의 simmilar 설정이 있지만 콜렉션을 사용합니다. 아마도 여러분의 문제에 대한 해결책이 될 수 있습니다! http://symfony.com/doc/current/cookbook/form/form_collections.html – acrobat

+0

반복 할 때마다 동일한 필드를 추가하기 위해 노력하고 있습니다 (응용 프로그램 이름 지정). 불가능합니다. 엔티티 부속 유형을 사용하여이 필드의 특수 유형을 작성하는 것이 좋습니다 – zulus

답변

4

콜렉션이 필요합니다. 컬렉션은 임의의 수의 요소를 허용합니다 (요구 사항을 충족 함). 문제는 컬렉션이 원하는 방식으로 작동하도록 UserGroupType이어야한다는 것입니다.

다음은 양식 유형의 완전한 예입니다. 네임 스페이스 및 기타 생략.

컨트롤러 (당신이 private $applications와 함께 무엇을하고 있는지하지 않는다, 양식에 User 객체를 전달하는 기억) :

... 
$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. 
} 

새 사용자 그룹 형식 :

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 그 기능을 원할 경우 양식에 새로운 UserGroups를 추가하는 방법을 보여줍니다.

+0

노력에 감사드립니다!솔루션의 문제는 내가 원하는 계층 구조를 얻지 못한다는 것입니다. 1. application1; 1.1. group1; 1.2. group2; 2. application2 등. 두 번째 것은 내가 사용자 엔티티를 편집하고 app/group을 선택하고 싶습니다. 솔루션에서 usergroup 엔티티를 편집 할 것입니다. 그 동안 엔티티 할당을 여러 형태로 나누어서 splittet을했습니다 - 그러나 나는 당신의 대답을 받아 들일 것으로 표시 할 것입니다. – Vilius