2012-10-18 11 views
17

Ho un tipo di campo di scelta denominato * sub_choice * nel mio modulo le cui scelte verranno caricate in modo dinamico tramite AJAX in base al valore selezionato del campo di scelta padre, denominato * parent_choice *. Caricamento delle scelte funziona perfettamente, ma sto incontrando un problema durante la convalida del valore della sub_choice al momento dell'invio. Fornisce un errore di convalida "Questo valore non è valido" poiché il valore inviato non è nelle scelte del campo sub_choice quando è stato creato. Quindi c'è un modo per convalidare correttamente il valore inviato del campo sub_choice? Di seguito è riportato il codice per creare il mio modulo. Sto usando Symfony 2.1.Convalida delle scelte caricate dinamicamente in Symfony 2

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('parent_choice', 'entity', array(
        'label' => 'Parent Choice', 
        'class' => 'Acme\TestBundle\Entity\ParentChoice' 
    )); 

    $builder->add('sub_choice', 'choice', array(
        'label' => 'Sub Choice', 
        'choices' => array(), 
        'virtual' => true 
    )); 
} 
+0

hai avuto fortuna con questo? Im bloccato su qualcosa di simile. –

+0

Una domanda simile più recente si collega a questo e una delle risposte sembra piuttosto buona, a che fare con l'utilizzo di un evento PRE_BIND per ordinare l'elenco valido di opzioni: http://stackoverflow.com/questions/18207476/symfony2- dinamico-form-scelte-validazione-rimuovere – frumious

+0

qui è la versione con qualsiasi valore accetta http://stackoverflow.com/questions/28245027/symfony-2-choice-ajax-validation-fix –

risposta

-3

Supponiamo che per le scelte secondarie l'ID sia corretto? Creare e array vuoto con un certo numero di valori e dare come una scelta

$indexedArray = []; for ($i=0; $i<999; $i++){ $indexedArray[$i]= ''; }

poi 'choices' => $indexedArray, :)

-2

non si può non costruire la convalida sub_choice perché durante si config suo validatore si don' so quali valori sono validi (i valori dipendono dal valore di parent_choice).

Quello che puoi fare è risolvere parent_choice in entità prima di creare nuovo YourFormType() nel tuo controller. Quindi è possibile ottenere tutti i valori possibili per sub_choice e fornirli tramite il costruttore del modulo - new YourFormType ($ subChoice).

In YourFormType si deve aggiungere __construct metodo come questo:

/** 
* @var array 
*/ 
protected $subChoice = array(); 

public function __construct(array $subChoice) 
{ 
    $this->subChoice = $subChoice; 
} 

e utilizzare i valori forniti in forma aggiuntivo:

$builder->add('sub_choice', 'choice', array(
       'label' => 'Sub Choice', 
       'choices' => $this->subChoice, 
       'virtual' => true 
)); 
18

per fare il trucco è necessario sovrascrivere il campo sub_choice prima inviando il modulo:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    ... 

    $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) { 
     $parentChoice = $event->getData(); 
     $subChoices = $this->getValidChoicesFor($parentChoice); 

     $event->getForm()->add('sub_choice', 'choice', [ 
      'label' => 'Sub Choice', 
      'choices' => $subChoices, 
     ]); 
    }); 
} 
+1

penso che questo risposta più fornisce completamente e direttamente ciò che la domanda vuole: le opzioni impostate dipendono da un altro valore selezionato, senza dover fornire tutte le opzioni per passare la convalida e quindi magari reimpostare le opzioni in seguito. Questo mi sembra la soluzione "corretta per Symfony 2". – frumious

2

questo accetta qualsiasi valore

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) { 
    $data = $event->getData(); 
    if(is_array($data['tags']))$data=array_flip($data['tags']); 
    else $data = array(); 
    $event->getForm()->add('tags', 'tag', [ 
     'label' => 'Sub Choice', 
     'choices' => $data, 
     'mapped'=>false, 
     'required'=>false, 
     'multiple'=>true, 
    ]); 
}); 
Problemi correlati