Я использую плагин 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; }
Если я плохой способ, дайте мне знать, потому что я сейчас не в курсе, я много чего делаю, например
url : $form.attr('action')
, я думаю, что он будет загружать опцию choices
с возможностью <option>
но мой выбор по-прежнему возвращается без none <option>
. и многое другое (не может remmenber).
А также я использую v3.1 в рамках фреймворка с v4.0.3 плагина select2, если вам нужна дополнительная информация, просто спросите и THX для чтения и попробуйте помочь.
редактировать
Просто добавьте некоторую информацию, чтобы быть более понятной