2017-10-20 38 views
0

Tout d'abord, permettez-moi d'admettre que je suis un amateur dans les formes de symfony. Toute aide sera grandement appréciée. Je ne suis pas autorisé à partager le code réel et par conséquent j'utilise un exemple de code pour démontrer le cas d'utilisation.Comment utiliser plusieurs types de formulaires dans symfony pour créer un formulaire unique avec la classe de données

Ci-dessous est le cas d'utilisation,

j'ai une entité appelée testEntity,

class testEntity { 
    private $property1; 
    private $property2; 
    private $property3; 

    //with setters and getters 
} 

J'ai un type de formulaire appelé formType1,

class formType1 extends AbstractType { 
     public function buildForm(FormBuilderInterface $builder, array $options) { 
      $builder 
       ->add('property2') 
       ->add('property3) 
      ; 
     } 

     public function buildView() { 
      // Code that create view vars 
     } 
    } 

Et j'ai un type de formulaire pour testEntity,

class testEntityType extends AbstractType { 
    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder->add('property1) 
     .... 
    } 

    public function configureOptions(OptionsResolver $resolver) { 
     $resolver->setDefaults([ 
      'data_class' => testEntity::class 
     ]); 
    } 
} 

formType1 est un type de formulaire sans classe de données et avec son propre modèle et sera utilisé par lui-même. Ce que je veux faire est de réutiliser formType1 dans testEntityType comme formType1 a les champs qui mappent aux propriétés de testEntity de sorte que lorsque soumis, je puisse obtenir l'objet testEntity avec les données de formulaire et je peux également obtenir la vue de formType1 dans mon formulaire final.

l'action du contrôleur a cela,

$testEntity = new testEntity(); 
$form = $this->createForm(PostType::class, $testEntity); 

de sorte que lorsque la forme présente je reçois $ testEntity avec les données de la forme

Toutes mes excuses à l'avance, si je ne l'ai pas formulé la question assez bien être compris.

a obtenu ce travail en faisant cela,

class testEntityType extends AbstractType { 
    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder->add('property1') 
      ->add('formType1', formType1::class, [ 
       'mapped' => false, 
       'data' => $options['data'] 
      ]) 
     .... 
    } 

    public function configureOptions(OptionsResolver $resolver) { 
     $resolver->setDefaults([ 
      'data_class' => testEntity::class 
     ]); 
    } 
} 

les données passées par des options et sett mapped-false.

Répondre

0

En fait, votre formType1 est juste un type personnalisé. Donc, la seule chose que vous avez à faire est d'importer votre Type que vous voulez utiliser et l'ajouter dans votre générateur comme vous le ferez avec un Type non personnalisé (ChoiceType, TextType, etc.).

use YourBundle\Type\formType1; 

class testEntityType extends AbstractType { 
    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder->add('property1') 
      ->add('formType1', formType1::class, [ 
       'data_class' => testEntity::class, //line edited 
      ]) 
     .... 
    } 

    public function configureOptions(OptionsResolver $resolver) { 
     $resolver->setDefaults([ 
      'data_class' => testEntity::class 
     ]); 
    } 
} 

PS: Attention au sujet de la convention de nommage de vos classes

+0

Merci pour votre réponse rapide. Si nous utilisons 'formType1' comme nom du formulaire enfant comme vous l'avez mentionné dans votre mise à jour, il va dire qu'il n'y a pas de méthode comme' getFormType1() 'ou des propriétés comme' formType1' dans 'testEntity'. –

+0

Pouvez-vous mettre à jour votre question avec votre action de contrôleur en utilisant ce formulaire? Que se passe-t-il si vous ajoutez 'data_class' dans votre constructeur (voir edit) –

+0

Mise à jour de la question avec du code dans l'action du contrôleur. En outre, en passant data_class dans le constructeur, il donne toujours la même erreur qui est la suivante, 'Ni la propriété" formType1 "ni l'une des méthodes" getFormType1() "," formType1() "," isFormType1() " , "hasFormType1()", "__get()" existe et a un accès public dans la classe "Entity \ testEntity" ' Comme nous passons data_class, le formulaire devrait avoir un enfant dont les noms correspondent aux propriétés de la classe de données et 'formType1' ne correspond à aucune propriété de' testEntity'. –