खोज…


AJAX के साथ विकल्प लोड करने के लिए चॉइस टाइप, एंटिटी टाइप और डॉक्यूमेंट टाइप का विस्तार कैसे करें।

सिम्फनी में, बिल्ट-इन चॉइस टाइप (और एंटिटी टाइप या डॉक्यूमेंट टाइप इसे बढ़ाते हुए), एक स्थिर विकल्प सूची के साथ आधारभूत कार्य।

यदि आप इसे अजाक्स कॉल के साथ काम करना चाहते हैं, तो आपको उन्हें किसी भी अतिरिक्त विकल्प को स्वीकार करने के लिए बदलना होगा।

  • खाली पसंद सूची के साथ कैसे शुरू करें?

    जब आप अपने फॉर्म का निर्माण करते हैं, तो choices विकल्प को खाली array() सेट करें:

     namespace AppBundle\Form;
    
     use Symfony\Component\Form\AbstractType;
    
     use Symfony\Component\Form\FormBuilderInterface;
    
     use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    
     class FooType extends AbstractType
     {
         public function buildForm(FormBuilderInterface $builder, array $options)
         {
             $builder
                 ->add('tag', ChoiceType::class, array('choices'=>array()));
         }
     }
    

    तो आपको बिना विकल्प के एक खाली चयन इनपुट मिलेगा। यह समाधान च्वाइसटेप और उसके सभी बच्चों (एंटिटी टाइप, डॉक्यूमेंट टाइप, ...) के लिए काम करता है।

  • सबमिट किए गए नए विकल्पों को कैसे स्वीकार करें :

    नए विकल्पों को स्वीकार करने के लिए, आपको उन्हें फॉर्म फील्ड गायक के रूप में उपलब्ध कराना होगा। आप FormEvent :: PRE_SUBMIT ईवेंट के साथ सबमिट किए गए डेटा के आधार पर अपना फ़ॉर्म फ़ील्ड बदल सकते हैं।

    यह उदाहरण दिखाता है कि इसे एक मूल च्वाइस टाइप के साथ कैसे करें:

     namespace AppBundle\Form;
    
     use Symfony\Component\Form\AbstractType;
    
     use Symfony\Component\Form\FormBuilderInterface;
    
     use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    
     class FooType extends AbstractType
     {
         public function buildForm(FormBuilderInterface $builder, array $options)
         {
             $builder
                 ->add('tag', ChoiceType::class, array('choices'=>array()))
             ;
             
             $builder->addEventListener(
                 FormEvents::PRE_SUBMIT,
                 function(FormEvent $event){
                     // Get the parent form
                     $form = $event->getForm();
                     
                     // Get the data for the choice field
                     $data = $event->getData()['tag'];
                     
                     // Collect the new choices
                     $choices = array();
                     
                     if(is_array($data)){
                         foreach($data as $choice){
                             $choices[$choice] = $choice;
                         }
                     }
                     else{
                         $choices[$data] = $data;
                     }
                     
                     // Add the field again, with the new choices :
                     $form->add('tag', ChoiceType::class, array('choices'=>$choices));
                 }
             );
         }
     }
    

    आपके सबमिट किए गए विकल्पों को अब अनुमति दी गई है और सिम्फनी च्वाइस टाइप बिल्ट-इन सत्यापन उन्हें अब अस्वीकार नहीं करेगा।

    यदि आप चॉइसटेप चाइल्ड (EntityType, DocumentType, ...) के साथ ऐसा ही करना चाहते हैं, तो आपको नए विकल्प को पॉपुलेट करते समय UnitManager या DocumentManager को इंजेक्ट करना होगा और डेटट्रांसफॉर्म करना होगा।

किसी अन्य फ़ील्ड को मान के आधार पर चुनें।

यह दिखाने के लिए एक उदाहरण है कि श्रेणी चयन फ़ील्ड के मूल्य के आधार पर एक उपश्रेणी चयन क्षेत्र पर अनुमत विकल्पों को कैसे बदलना है। ऐसा करने के लिए आपको क्लाइंट और सर्वर साइड दोनों के लिए अपनी उपश्रेणी पसंद को गतिशील बनाना होगा।

1. प्रदर्शन / उपयोगकर्ता इंटरैक्शन के लिए क्लाइंट पक्ष पर प्रपत्र को गतिशील बनाएं

क्लाइंट साइड डायनामिक फॉर्म (जावास्क्रिप्ट / JQuery का उपयोग करके) का उदाहरण:

    $('#category').change(function(){
        switch($(this).val()){
            case '1': // If category == '1'
                var choice = {
                    'choice1_1':'1_1',
                    'choice1_2':'1_2',
                    'choice1_3':'1_3',
                };
            break;
            case '2': // If category == '2'
                var choice = {
                    'choice2_1':'2_1',
                    'choice2_2':'2_2',
                    'choice2_3':'2_3',
                };
            break;
            case '3': // If category == '3'
                var choice = {
                    'choice3_1':'3_1',
                    'choice3_2':'3_2',
                    'choice3_3':'3_3',
                };        
            break;
        }
        
        var $subCategorySelect = $('#subCategory');
        
        $subCategorySelect.empty();
        $.each(choice, function(key, value) {
            $subCategorySelect.append($('<option></option>')).attr('value',value).text(key);
        });
    });

बेशक आप AJAX कॉल से विकल्प प्राप्त कर सकते हैं। यह इस उदाहरण का उद्देश्य नहीं है।

2. प्रारंभिक / सत्यापन के लिए सर्वर की तरफ प्रपत्र को गतिशील बनाएं

सर्वर साइड डायनामिक फॉर्म का उदाहरण:

    namespace AppBundle\Form;

    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;

    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;

    use Symfony\Component\Form\FormEvent;
    use Symfony\Component\Form\FormEvents;

    class MyBaseFormType extends AbstractType
    {
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('category',ChoiceType::class,array('choices'=>array(
                        'choice1'=>'1',
                        'choice2'=>'2',
                        'choice3'=>'3',
                    )))
            ;
            
            $addSubCategoryListener = function(FormEvent $event){
                $form = $event->getForm();
                $data = $event->getData();
                
                switch($data['category']){
                    case '1': // If category == '1'
                        $choices = array(
                            'choice1_1'=>'1_1',
                            'choice1_2'=>'1_2',
                            'choice1_3'=>'1_3',
                        );
                    break;
                    case '2': // If category == '2'
                        $choices = array(
                            'choice2_1'=>'2_1',
                            'choice2_2'=>'2_2',
                            'choice2_3'=>'2_3',
                        );                        
                    break;
                    case '3': // If category == '3'
                        $choices = array(
                            'choice3_1'=>'3_1',
                            'choice3_2'=>'3_2',
                            'choice3_3'=>'3_3',
                        );                        
                    break;
                }
                
                $form->add('subCategory',ChoiceType::class,array('choices'=>$choices));
            };
            
            // This listener will adapt the form with the data passed to the form during construction :
            $builder->addEventListener(FormEvents::PRE_SET_DATA, $addSubCategoryListener);
            
            // This listener will adapt the form with the submitted data :
            $builder->addEventListener(FormEvents::PRE_SUBMIT, $addSubCategoryListener);
        }
    }


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow