2015-09-17 10 views
5

utilizzare Componente Forma e hanno un choice Field Type su una forma che viene reso ad un campo di selezione. Su un lato client che uso select2 plugin che inizializza il prescelto con l'impostazione tags: true scomparsa che permette di aggiungere un nuovo valore in esso. Ma se posso aggiungere un nuovo valore poi una convalida su un server verrà effettuata con errorepermettono di aggiungere un nuovo valore in un tipo di scelta di campo

Questo valore non è valido.

perché il nuovo valore non è in una lista di scelta.

C'è un modo per permettere l'aggiunta di un nuovo valore a scelta un tipo di campo?

risposta

12

Il problema è in un trasformatore scelta, che cancella i valori che non esistono in una lista scelta.
The workaround with disabling the transformer mi ha aiutato:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('choiceField', 'choice', ['choices' => $someList]); 

    // more fields... 

    $builder->get('choiceField')->resetViewTransformers(); 
} 
+0

Non funziona per esteso => ​​true –

1

No, non c'è.

Si dovrebbe implementare questo manuale che può essere:

  • utilizzando gli eventi Select2 per creare la nuova scelta tramite ajax
  • cattura le opzioni postato prima di convalidare il modulo e aggiungerlo alla lista delle opzioni
3

Ecco un codice di esempio nel caso in cui qualcuno ha bisogno di questo per EntityType al posto del ChoiceType. Aggiungi questo al tuo FormType:

use AppBundle\Entity\Category; 
use Symfony\Component\Form\FormEvent; 
use Symfony\Component\Form\FormEvents; 

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) { 
    $data = $event->getData(); 

    if (!$data) { 
     return; 
    } 

    $categoryId = $data['category']; 

    // Do nothing if the category with the given ID exists 
    if ($this->em->getRepository(Category::class)->find($categoryId)) { 
     return; 
    } 

    // Create the new category 
    $category = new Category(); 
    $category->setName($categoryId); 
    $this->em->persist($category); 
    $this->em->flush(); 

    $data['category'] = $category->getId(); 
    $event->setData($data); 
}); 
Problemi correlati