Transformateur de données Symfony2 sur un type de champ Choice

Je vais étape par étape avec Comment utiliser les transformateurs de données

Le problème est que si je veux faire cela avec un type de choix? Lequel je remplis dynamicment avec jQuery?

J’ai testé l’exemple fourni (sans créer de type personnalisé ..) et cela fonctionne à 100% avec le type de champ de texte, mais dès que je le change en choix et que je lui donne des choix vides, il ne fonctionne pas. faire avec moi remplir les choix avec jQuery après le chargement de la page?

Exemple

Modèle [Sélectionnez avec l’entité Modèle chargée avec le générateur de requête et le type de champ Entité …]

Number [Choix vide au début, lorsque le modèle change, je fais une demande AJAX pour les numéros de ce modèle]

Si je laisse le numéro sous forme de champ de texte et que je tape manuellement un nombre valide (en regardant la firebase database), cela fonctionne, mais si je le laisse à jQuery et à un type de choix, une erreur de formulaire avec une valeur non valide pour le modèle est renvoyée.

Dans les deux cas, je fais print_r ($ request-> request) avant de manipuler le formulaire et dans les deux cas, il soumet Number => 1, ce qui est correct dans cet exemple, mais il ne s’agit pas d’une transformation des données lorsque leur type est Choice mais lorsque c’est le texte qu’il fait.

Voici comment jQuery remplit les données de la boîte de sélection de numéro:

1234ABCDEFG 

Btw, je suis en train de transformer avec l’ID, ce qui serait la valeur de l’option sélectionnée.

D’accord. Ce que vous devez faire est d’écouter l’événement de formulaire preSubmit, puis d’accepter la valeur soumise en l’ajoutant à l’élément de votre choix.

http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-form-events-submitted-data

=============================================== =====

Je n’ai pas regardé votre corbeille à pâte, mais voici un exemple qui semble fonctionner pour moi. C’est une simple liste de choix de genre à laquelle j’ajoute une autre option côté client. L’écouteur preSubmit remplace simplement les options de choix de genre par défaut par une option contenant tout ce qui a été soumis. Vous devriez pouvoir append des éléments de transformation de données et être prêt à partir.

 namespace Cerad\Bundle\TournBundle\Form\Type\Test; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormFactoryInterface; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\EventDispatcher\EventSubscriberInterface; class DynamicFormType extends AbstractType { public function getName() { return 'cerad_tourn_test_dynamic'; } public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('gender', 'choice', array( 'choices' => array('m' => 'Male', 'f' => 'Female'), 'required' => false, )); $builder->addEventSubscriber(new DynamicFormListener($builder->getFormFactory())); } } class DynamicFormListener implements EventSubscriberInterface { private $factory; public function __construct(FormFactoryInterface $factory) { $this->factory = $factory; } public static function getSubscribedEvents() { return array( FormEvents::PRE_SUBMIT => 'preSubmit', FormEvents::PRE_SET_DATA => 'preSetData', ); } public function preSetData(FormEvent $event) { // Don't need return; } public function preSubmit(FormEvent $event) { $data = $event->getData(); $gender = $data['gender']; if (!$gender) return; // If nothing was actually chosen $form = $event->getForm(); /* ================================================= * All we need to do is to replace the choice with one containing the $gender value * Once this is done $form->isValid() will pass * * I did attempt to just add the option to the existing gender choice * but could not see how to do it. * $genderForm = form->get('gender'); // Returns a Form object * $genderForm->addNewOptionToChoicesList ??? * * Might want to look up 'whatever' but that only comes into play * if the form fails validation and you paas it back to the user * You could also use client side javascript to replace 'whatever' with the correct value */ $form->add($this->factory->createNamed('gender','choice', null, array( 'choices' => array($gender => 'whatever'), 'required' => false, 'auto_initialize' => false, ))); return; } }