2017-03-13 15 views
0

Ich habe eine Hauptform (StrainType), die von StrainGmoType geerbt wird, und StrainGmoType verband einen StrainPlasmidType.Symfony: dynamische Form mit umgebender Form

In der Hauptform (StrainType) habe ich ein Feld, in dem der Benutzer ein Team auswählt, dann hängen einige Felder von dieser Auswahl ab (hauptsächlich die untergeordneten und eingebetteten Formulare). Für alle Felder, die im Hauptformular oder Kind deklariert sind, funktioniert es. Aber ich habe 2 CollectionType, in diesem CollectionType habe ich ManyToMany Relation mit Argument. Dann mache ich einen bestimmten Typ (StrainPlasmidType), und im Haupt- und Kindtyp rufe ich sie in einem CollectionType auf (im Beispiel nur im Kind)). Aber ich kann nicht das Teamfeld in diesem Typ, dann kann ich nicht PRE_SET_DATA, PRE_SUBMIT oder POST_SUBMIT ...

Ich habe versucht, inherit_data verwenden, aber es ist nicht für diesen Fall angepasst. Wie kann ich die Daten des Teamfeldes im StrainPlasmidType bekommen?

Ein Teil des Codes:

Die 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, 
       ]) 

Die GmoStrain Form:

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; 
     } 
    } 

Die 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 --', 
       ]) 
      ; 

Antwort

0

Schließlich habe ich nur verwenden Optionen des Formulars t o die Daten an die einbetten Form senden:

Im Haupt:

$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, 
    ]); 

Und in der Einbettungsform:

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')); 
    }