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
Odpowiedz
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,
:)
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
));
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,
]);
});
}
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
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,
]);
});
Czy masz na to szczęście? utknąłem na czymś podobnym. –
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
Oto wersja z dowolnej wartości zaakceptować http://stackoverflow.com/questions/28245027/symfony-2-choice-ajax-validation-fix –