2017-06-10 2 views
0

Je travaille sur le formulaire de symfony que j'utilise select2 dans le champ pour une demande de paiement ajax, j'écouter l'événement PRE_SUBMIT pour obtenir la liste des choix et donner aux choices les optionsévénement formulaire Symfony: champ ChoiceType return null de façon inattendue

$opts = $config->getOptions(); 
$opts['choices'] = $listImages; //array of Image object 

mais en cas PRE_SUBMIT dans un var_dump i obtenir la valeur sélectionnée dans la forme, et l'utiliser dans la fermeture, et quand le champ persiste ont une valeur nulle, donc je fais un var_dump en cas POST_SUBMIT le terrain avoir vraiment null comme valeur. Et je ne vois pas ce que je manqué

Mon FormType ci-dessous:

class ArticleType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('image', ChoiceType::class, array(
      'expanded' => false, 
      'multiple' => false)) 
     //other field 
     ; 

     $formModifier = function (FormInterface $form, $image) use ($options) { 
     $listImages = $options['em']->getRepository('AlmotivAppBundle:Image')->findBy(array(
      'id' => $image 
     )); 

     if (!$listImages) { 
      $form->add('image')->addError(new FormError(
       'Nous n\'avons pas p trouver l\'image, veuiller choisir une autre' 
      )); 
     } 
     //die(var_dump($listImages)); //array of Image object 


     $config = $form->get('image')->getConfig(); 
     $opts = $config->getOptions(); 
     $opts['choices'] = $listImages; 
     $typeName = get_class($config->getType()->getInnerType()); 
     $form->add('image', $typeName, $opts); 
     //die(var_dump($form->get('image')->getConfig()->getData())); //return null 
    }; 

    $builder->get('image')->addEventListener(
     FormEvents::PRE_SUBMIT, 
     function (FormEvent $event) use ($formModifier) { 
      $image = $event->getData(); 
      //die(var_dump($image)); //return 10 
      $formModifier($event->getForm()->getParent(), $image); 
     } 
    ); 

Et j'utilise la v3.1 du cadre. Si vous avez besoin de plus, il suffit de demander.

Répondre

0

Cela semble être une valeur totalement valide à renvoyer à ce moment-là.

Pendant le PRE_SUBMIT vous obtenez le formulaire parent et le transmettez à $formModifier, ce qui est OK. Cependant, ce modificateur fait ce qui suit, entre autres:

$typeName = get_class($config->getType()->getInnerType()); 
$form->add('image', $typeName, $opts); 

Il arrive que vous avez déjà un champ nommé image en vous formez, mais l'ajouter de nouveau complètement Ecrase son contexte (y compris les données). En vous prenez un coup d'oeil dans Form.php, vous verrez:

ligne form.php 873

$this->children[$child->getName()] = $child; 

Cela dit, vous ne pouvez pas récupérer les données une fois que vous chevaucher le champ de formulaire.

Pourquoi avez-vous besoin de récupérer les données après avoir rajouté le champ?

+0

pour le conserver dans le DB, le champ a une relation 'ManyToOne' donc je dois passer la valeur de l'option sélectionnée à Doctrine si je n'ai pas reçu d'erreur comme si la valeur n'était pas valide. Comme je peux le voir, vous ne pouvez pas modifier la configuration d'un champ après la construction, corrigez-moi si je me trompe, mais vous pouvez le remplacer, donc je l'ai fait et je sais que j'ai perdu les données. Maintenant, la question est Comment puis-je passer le 'imagesList' à la' $ options [choix] 'sans perdre le champ de données? –

+0

et @JovanPerovic je ne pense pas re-ajouter le champ est une cause cause quand je passe le '$ event' à la fermeture et en faisant' $ event-> getData(); 'dans l'événement' POST_SUBMIT' j'ai reçu le soumis données, puis je rajoute le champ dans l'événement PRE_SUBMIT, et la chose mystère est quand faire $ event-> getForm(); 'dans POST_SUBMIT mon champ d'image a la valeur« null »et mon autre champ a la bonne valeur. Comment puis-je gérer cela? –

+0

J'ai deux solutions pour gérer cela 1- Est de mettre les données dans le formulaire moi-même parce que je ne comprends pas pourquoi l'image a toujours une valeur nulle. 2- Utilise non mappé puis avec l'événement ajoute mon champ d'image avec les données soumises en type de texte (ce qui n'est pas la meilleure façon, je pense (car l'image a beaucoup de relation avec mon article), mais c'est la seule found) –