2012-10-18 35 views
17

में गतिशील रूप से लोड किए गए विकल्पों को मान्य करना मेरे पास मेरे फॉर्म में * उप_चॉइस * नामक एक विकल्प फ़ील्ड प्रकार है जिसका विकल्प एजेक्स के माध्यम से डायनामिक रूप से लोड किया जाएगा, जिसे पैरेंट पसंद फ़ील्ड के चयनित मूल्य के आधार पर * parent_choice * नाम दिया गया है। विकल्पों को लोड करना पूरी तरह से काम करता है लेकिन सबमिट करने पर sub_choice के मान को सत्यापित करते समय मुझे समस्या आ रही है। यह "यह मान वैध नहीं है" सत्यापन त्रुटि देता है क्योंकि सबमिट किए गए मान sub_choice फ़ील्ड के चयन में नहीं होते हैं। तो क्या कोई तरीका है कि मैं sub_choice फ़ील्ड के सबमिट किए गए मान को सही ढंग से मान्य कर सकता हूं? नीचे मेरा फॉर्म बनाने के लिए कोड है। मैं सिम्फनी 2.1 का उपयोग कर रहा हूँ।सिम्फनी 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

क्या आपके पास इसके साथ कोई भाग्य है? मैं कुछ इसी तरह अटक गया हूँ। –

+0

विकल्पों के वैध सूची को हल करने के लिए PRE_BIND ईवेंट का उपयोग करने के साथ ऐसा करने के लिए एक और हालिया समान प्रश्न लिंक हैं, और उत्तर में से एक बहुत अच्छा दिखता है: http://stackoverflow.com/questions/18207476/symfony2- गतिशील फार्म-विकल्प-मान्यता-हटाने – frumious

+0

यहाँ किसी भी मूल्य के साथ संस्करण को स्वीकार कर रहा है http://stackoverflow.com/questions/28245027/symfony-2-choice-ajax-validation-fix –

उत्तर

-3

मान लीजिए कि उप विकल्पों के लिए आपके पास आईडी है? बनाएँ और मूल्यों की एक निश्चित संख्या के साथ खाली सरणी और क्योंकि आप अपनी सत्यापनकर्ता विन्यास आप डॉन 'के दौरान एक विकल्प

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

तो 'choices' => $indexedArray, :)

-2

आप sub_choice सत्यापन का निर्माण नहीं नहीं कर सकते हैं के रूप में यह देना टी नहीं जानता कि कौन से मान वैध हैं (मान parent_choice के मान पर निर्भर करते हैं)।

आप अपने नियंत्रक में नया YourFormType() बनाने से पहले इकाई में parent_choice को हल करने के लिए क्या कर सकते हैं। फिर आप sub_choice के लिए सभी संभावित मान प्राप्त कर सकते हैं और उन्हें फॉर्म कन्स्ट्रक्टर - नया YourFormType ($ subChoice) प्रदान कर सकते हैं।

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

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

और फार्म ऐड में प्रदान की जाती मूल्यों का उपयोग:

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

चाल इससे पहले कि आप sub_choice क्षेत्र के ऊपर लिख करने की जरूरत है ऐसा करने के लिए

YourFormType में आप इस तरह विधि __construct जोड़ने के लिए फॉर्म जमा करना:

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

मैं इस सवाल का जवाब लगता है कि ज्यादातर पूरी तरह से और सीधे देता है कि सवाल क्या चाहता है: विकल्प किसी अन्य चयनित मूल्य पर निर्भर सेट करते हैं, बिना सत्यापन के पास सभी विकल्पों को गलती से प्रदान किए बिना और फिर बाद में विकल्पों को फिर से सेट कर सकते हैं। यह मुझे "उचित सिम्फनी 2" समाधान के रूप में मारता है। – frumious

2

यह किसी भी मान को स्वीकार करता है

$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, 
    ]); 
});