Symfony2 - Dynamic form choices - validation remove

前端 未结 5 1065
挽巷
挽巷 2021-01-02 00:28

I have a drop down form element. Initially it starts out empty but it is populated with values via javascript after the user has made some interactions. Thats all working

5条回答
  •  無奈伤痛
    2021-01-02 00:56

    after much time messing around trying to find it. You basically need to add a PRE_BIND listener. You add some extra choices just before you bind the values ready for validation.

    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormEvents;
    use Symfony\Component\Form\FormEvent;
    
    
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    
      // .. create form code at the top
    
        $ff = $builder->getFormFactory();
    
        // function to add 'template' choice field dynamically
        $func = function (FormEvent $e) use ($ff) {
          $data = $e->getData();
          $form = $e->getForm();
          if ($form->has('verified_city')) {
            $form->remove('verified_city');
          }
    
    
          // this helps determine what the list of available cities are that we can use
          if ($data instanceof  \Portal\PriceWatchBundle\Entity\PriceWatch) {
            $country = ($data->getVerifiedCountry()) ? $data->getVerifiedCountry() : null;
          }
          else{
            $country = $data['verified_country'];
          }
    
          // here u can populate choices in a manner u do it in loadChoices use your service in here
          $choices = array('', '','Manchester' => 'Manchester', 'Leeds' => 'Leeds');
    
          #if (/* some conditions etc */)
          #{
          #  $choices = array('3' => '3', '4' => '4');
          #}
          $form->add($ff->createNamed('verified_city', 'choice', null, compact('choices')));
        };
    
        // Register the function above as EventListener on PreSet and PreBind
    
        // This is called when form first init - not needed in this example
        #$builder->addEventListener(FormEvents::PRE_SET_DATA, $func); 
    
        // called just before validation 
        $builder->addEventListener(FormEvents::PRE_BIND, $func);  
    
    }
    

提交回复
热议问题