2017-03-13 4 views
0

저는 StrainGmoType에 의해 상속되는 기본 폼 (StrainType)을 가졌으며 StrainGmoType에는 StrainPlasmidType이 임베드되었습니다.Symfony : 포함 양식이있는 동적 양식

기본 양식 (StrainType)에는 사용자가 팀을 선택한 필드가 있고 일부 필드는이 선택 사항 (기본, 하위 및 포함 된 양식)에 따라 다릅니다. 기본 양식이나 하위에 선언 된 모든 필드의 경우 작동합니다. 하지만 2 CollectionType을 가지고 있는데,이 CollectionType에 ManyToMany Relation with Argument가 있습니다. 그런 다음 특정 유형 (StrainPlasmidType)을 수행하고 기본 및 하위 유형에서이를 CollectionType (이 예에서는 하위)에서 호출합니다. 하지만이 유형의 팀 필드를 가져올 수 없다면 PRE_SET_DATA, PRE_SUBMIT 또는 POST_SUBMIT을 수행 할 수 없습니다.

저는 inherit_data를 사용하려고했지만이 경우에는 적합하지 않습니다. StrainPlasmidType에서 팀 필드의 데이터를 얻으려면 어떻게해야합니까?

코드의 일부 :

StrainForm :

class StrainType extends AbstractType 
    { 
     public function buildForm(FormBuilderInterface $builder, array $options) 
     { 
      $builder 
       ->add('team', EntityType::class, [ 
        'class' => 'AppBundle\Entity\Team', 
        'query_builder' => function (EntityRepository $er) { 
         return $er->createQueryBuilder('team') 
          ->leftJoin('team.members', 'members') 
          ->leftJoin('team.projects', 'projects') 
          ->leftJoin('projects.members', 'project_members') 
          ->where('members = :user') 
          ->orWhere('project_members = :user') 
          ->setParameter('user', $this->tokenStorage->getToken()->getUser()); 
        }, 
        'data' => $this->tokenStorage->getToken()->getUser()->getFavoriteTeam(), 
        'choice_label' => 'name', 
        'placeholder' => '-- select a team --', 
        'mapped' => false, 
       ]) 

GmoStrain 양식 :

class StrainGmoType extends AbstractType 
    { 
     public function buildForm(FormBuilderInterface $builder, array $options) 
     { 
      $builder 
       ->add('strainPlasmids', CollectionType::class, [ 
        'entry_type' => StrainPlasmidType::class, 
        'allow_add' => true, 
        'allow_delete' => true, 
        'by_reference' => false, 
        'required' => false, 
       ]) 

       //... 

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

     public function getParent() 
     { 
      return StrainType::class; 
     } 
    } 

StrainPlasmidType :

class StrainPlasmidType extends AbstractType 
    { 
     public function buildForm(FormBuilderInterface $builder, array $options) 
     { 
      $builder 
       ->add('plasmid', EntityType::class, [ 
        'class' => 'AppBundle\Entity\Plasmid', 
        'query_builder' => function (EntityRepository $er) { 
         return $er->createQueryBuilder('p') 
          ->leftJoin('p.team', 'team') 
          ->leftJoin('team.members', 'members') 
          ->where('members = :user') 
          ->setParameter('user', $this->tokenStorage->getToken()->getUser()) 
          ->orderBy('p.autoName', 'ASC') 
         ; 
        }, 
        'group_by' => function (Plasmid $plasmid) { 
         return $plasmid->getTeam()->getName(); 
        }, 
        'choice_label' => function (Plasmid $plasmid) { 
         return $plasmid->getAutoName().' - '.$plasmid->getName(); 
        }, 
        'placeholder' => '-- select a plasmid --', 
       ]) 
       ->add('state', ChoiceType::class, [ 
        'choices' => [ 
         'Replicative' => 'replicative', 
         'Integrated' => 'integrated', 
         'Cured' => 'cured', 
        ], 
        'placeholder' => '-- select a state --', 
       ]) 
      ; 

답변

0

마지막으로, 난 그냥 사용 양식 t의 옵션 임베드 형태

$form->add('strainPlasmids', CollectionType::class, [ 
     'entry_type' => StrainPlasmidType::class, 
     'entry_options' => [ 
      'parent_data' => $team, 
     ], 
     'allow_add' => true, 
     'allow_delete' => true, 
     'by_reference' => false, 
     'required' => false, 
    ]); 

하고 : 주에서는

을 : O 임베딩 형태로 데이터를 전송

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('plasmid', EntityType::class, [ 
       'class' => 'AppBundle\Entity\Plasmid', 
       'query_builder' => function (EntityRepository $er) use ($options) { 
        return $er->createQueryBuilder('p') 
         ->leftJoin('p.team', 'team') 
         ->where('team = :team') 
         ->setParameter('team', $options['parent_data']) 
         ->orderBy('p.autoName', 'ASC') 
        ; 
       }, 

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

     $resolver->setRequired(array('parent_data')); 
    }