2013-07-23 28 views
6

Ich habe zwei Auswahlfelder, eines davon abhängig vom anderen.Ein dynamisch gefülltes Auswahlfeld validieren

Beim Erstellen des Formulars bekam das abhängige Feld ein leeres Auswahlfeld.

Ich fülle dieses Feld dann in JavaScript, um einige Daten von einer Aktion anzufordern.

Das Problem kommt von der Validierung. Natürlich wird es nicht bestanden, weil einzelne oder mehrere Werte nicht gegen leere Werte gültig sein können. Um das zu lösen, habe ich eine PRE_BIND Listener erstellt, die im Grunde entfernen Sie dann das Auswahlfeld mit den richtigen Werten neu erstellen, aber es noch Validierung nicht bestanden.

$form->getErrors() gibt nichts zurück $form->getErrorsAsString() gibt mir einen Fehler auf meinem Auswahlfeld zurück.

Meine Form:

<?php 

namespace Foo\BarBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\Form\FormEvent; 
use Symfony\Component\Form\FormEvents; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class BarFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     // other fields 

     // This field is filled in ajax 
     $builder->add('stores', 'choice', array(
      'label' => 'form.label.stores', 
      'translation_domain' => 'FooBarBundle', 
      'choices' => $options['storesList'], 
      'required' => false, 
      'multiple' => true, 
      'auto_initialize' => false, 
      'attr' => array(
       'class' => 'chzn-select', 
       'placeholder' => 'form.placeholder.stores' 
     ))); 

     $func = function (FormEvent $e) use ($options) { 
      $data = $e->getData(); 
      $form = $e->getForm(); 
      if ($form->has('stores')) { 
       $form->remove('stores'); 
      } 

      $brand = isset($data['brand']) ? $data['brand'] : null; 

      if ($brand !== null) { 
       $choices = $options['miscRepo']->getStoresNameIndexedById($brand); 
       $choices = array_keys($choices); 
       $choices = array_map('strval', $choices); 
      } else { 
       $choices = array(); 
      } 

      $form->add('stores', 'choice', array('choices' => $choices, 'multiple' => true, 'attr' => array('class' => 'chzn-select'))); 
     }; 

     $builder->addEventListener(FormEvents::PRE_SUBMIT, $func); 
    } 

    public function getName() 
    { 
     return 'bar_form_campaign'; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setRequired(array(
      'storesList', 
      'miscRepo', 
     )); 
    } 
} 
+2

Welcher Fehler wird zurückgegeben? Beachten Sie, dass die Auswahlmöglichkeiten in den * Schlüsseln * des Arrays "Auswahl" enthalten sein müssen, nicht in den Werten. –

+2

Was ist mit der Verwendung von "Entity" -Formular? http://symfony.com/doc/current/reference/forms/types/entity.html – gondo

+0

Kannst du den Ajax schreiben, der das Formularelement "Stores" füllt? Welcher Fehler wird zurückgegeben? – jdharandas

Antwort

0

hatte ich das gleiche Problem wie bei Ihnen: ein Feld über Javascript zu aktualisieren, aber nicht bestehen die Validierung. Lesen Sie beim Ereignis PRE_SUBMIT den Wert, den Sie mit JavaScript hinzugefügt haben, fragen Sie ab und rufen Sie das Objekt mit dieser ID ab, und aktualisieren Sie die Feldauswahl.

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) { 
    $data = $event->getData(); 
    $form = $event->getForm(); 
    $pageId = $data['page_id']; 

    $page = $this->myManager->getPage($pageId); 
    $options = array($page->getId() => $page->getTitle()); 

    $form->add('page_id', 'choice', array(
     'label'   => 'Select page', 
     'choices'  => $options, 
     'required'  => true, 
     'placeholder' => 'Select page' 
    )); 

    $form->getData()->setPageId($pageId); 
}); 
Verwandte Themen