2012-10-18 12 views
17

Mam typ pola wyboru o nazwie * sub_choice * w mojej formie, którego wybory będą dynamicznie ładowane przez AJAX w zależności od wybranej wartości pola wyboru nadrzędnego o nazwie * parent_choice *. Ładowanie opcji działa idealnie, ale napotykam problem podczas sprawdzania wartości sub_choice po przesłaniu. Daje on błąd sprawdzania poprawności "Ta wartość nie jest poprawna", ponieważ przesłana wartość nie znajduje się w polu wyboru podrzędnego po jej utworzeniu. Czy istnieje sposób, aby poprawnie sprawdzić poprawność przesłanej wartości pola sub_choice? Poniżej znajduje się kod do budowania mojego formularza. Używam Symfony 2.1.Sprawdzanie poprawności załadowanych dynamicznie opcji w Symfony 2

+0

Czy masz na to szczęście? utknąłem na czymś podobnym. –

+0

Bardziej aktualne podobne pytanie jest powiązane z tym, a jedna z odpowiedzi wygląda całkiem nieźle, dotyczy użycia zdarzenia PRE_BIND w celu uporządkowania prawidłowej listy opcji: http://stackoverflow.com/questions/18207476/symfony2- dynamic-form-wybory-validation-remove – frumious

+0

Oto wersja z dowolnej wartości zaakceptować http://stackoverflow.com/questions/28245027/symfony-2-choice-ajax-validation-fix –

Odpowiedz

-3

Załóżmy, że masz podrzędne prawa wyborcze? Tworzenie i pusta tablica z pewnej liczby wartości i przekazać go jako wybór

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

następnie 'choices' => $indexedArray, :)

-2

nie można nie budować walidacji sub_choice ponieważ podczas config jego walidator don” t wiedzieć, które wartości są prawidłowe (wartości zależą od wartości parent_choice).

To, co możesz zrobić, to rozwiązać parent_choice w encji, zanim utworzysz nowy YourFormType() w kontrolerze. Następnie możesz uzyskać wszystkie możliwe wartości dla sub_choice i podać je za pomocą konstruktora formularzy - new YourFormType ($ subChoice).

W YourFormType trzeba dodać __construct sposób podobny do tego:

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

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

i używać dostarczonych wartości w postaci dodatku:

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

rade trzeba przed zastąpić pole sub_choice przesłanie formularza:

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

myślę tę odpowiedź najbardziej całkowicie i bezpośrednio daje to, czego chce pytanie: zestaw opcji jest zależny od innej wybranej wartości, bez konieczności dostarczania wszystkich opcji do sprawdzania poprawności, a następnie może później zmienić opcje. To mnie uderza jako "właściwe rozwiązanie Symfony 2". – frumious

2

akceptuje dowolną wartość

$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, 
    ]); 
}); 
Powiązane problemy