Symfony, как использовать событие формы для проверки динамической клиентской формы

Я использую плагин select2 с ajax, чтобы иметь динамическое поле в моей форме, но когда я отправлю его, верните мне ошибку «Это значение недействительно» , что является нормальной причиной, когда я использую ChoiceType с пустым array() в choices выбора при создании. Согласно этой части документа symfony, событие формы – это мой спаситель, поэтому он пытается использовать его, но он выглядит как-то не так с моим кодом и не может действительно понять, что.

Итак, мой вопрос:

КАК передать возможность выбора полю, чтобы форма была действительной.

Моя форма Тип

 class ArticleType extends AbstractType { /** * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder //My other field //My functions to add the field with the possible choices $formModifier = function (FormInterface $form, $imageValue) use ($options) { if ($imageValue !== null) { $listImages = $this->getChoiceValue($imageValue, $options); if (!$listImages) { $form->get('image')->addError(new FormError( 'Nous n\'avons pas pu trouver l\'image, veuiller choisir une autre' )); } } else { $listImages = array(); } //die(var_dump($listImages)); //Array of Image $form->add('image', ChoiceType::class, array( 'attr' => array( 'id' => 'image'), 'expanded' => false, 'multiple' => false, 'choices' => $listImages)); }; $formModifierSubmit = function (FormInterface $form, $imageValue) use ($options) { if ($imageValue !== null) { $listImages = $this->getChoiceValue($imageValue, $options); if (!$listImages) { $form->get('image')->addError(new FormError( 'Nous n\'avons pas pu trouver l\'image, veuiller choisir une autre' )); } } else { $form->get('image')->addError(new FormError( 'Veuillez choisir une image svp' )); } //die(var_dump($listImages)); //Array of Image object $config = $form->get('image')->getConfig(); $opts = $config->getOptions(); $chcs = array('choices' => $listImages); //die(var_dump($chcs)); //output an array with a 'choices' keys with array value array_replace($opts, $chcs); //not work //array_merge($opts, $chcs); //not work //die(var_dump($opts)); //replacements/merge are not made }; $builder->addEventListener( FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formModifier) { // this would be the entity Article $data = $event->getData(); $formModifier($event->getForm(), $data->getImage()); } ); //$builder->get('image')->addEventListener( //give error cause the field image don't exist $builder->addEventListener( FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($formModifierSubmit) { $imageVal = $event->getData(); //die(var_dump($imageVal)); //return all the submitted data field in an array //But when change this event to Submit it return the Article model populated by the submitted data, EXCEPT the image field which have null as value $formModifierSubmit($event->getForm(), $imageVal['image']); } ); } public function getChoiceValue($imageValue, $options) { $listImages = $options['em']->getRepository('AlmotivAppBundle:Image')->findBy(array( 'id' => $imageValue )); return $listImages; //array of Image object } [...] } 

Для информации

Поле моего image не зависит от какого-либо другого поля, такого как пример doc, поэтому мне нужно заполнить choices выбора в событии PRE_SUBMIT чтобы дать возможный выбор.

А также image имеет отношение ManyToOne в моем объекте Article

 class Article implements HighlightableModelInterface { //some properties /** * @ORM\ManyToOne(targetEntity="Image\Entity\Path", cascade={"persist"}) * @Assert\Valid() */ private $image; } 

Если я плохой способ, дайте мне знать, потому что я сейчас не в курсе, я много чего делаю, например

  • array_replace с параметрами в конфигурации поля, но не ошибся.
  • сделайте запрос ajax к URL-адресу формы action url : $form.attr('action') , я думаю, что он будет загружать опцию choices с возможностью <option> но мой выбор по-прежнему возвращается без none <option> .

и многое другое (не может remmenber).

А также я использую v3.1 в рамках фреймворка с v4.0.3 плагина select2, если вам нужна дополнительная информация, просто спросите и THX для чтения и попробуйте помочь.

редактировать

Просто добавьте некоторую информацию, чтобы быть более понятной