Allow to add a new value in a choice Field Type

后端 未结 3 1585
名媛妹妹
名媛妹妹 2021-02-05 15:20

I use Form Component and have a choice Field Type on a form which is rendered to a select field. On a client-side I use select2 plugin which initializes the select with the sett

相关标签:
3条回答
  • 2021-02-05 15:39

    Here's an example code in case someone needs this for EntityType instead of the ChoiceType. Add this to your FormType:

    use AppBundle\Entity\Category;
    use Symfony\Component\Form\FormEvent;
    use Symfony\Component\Form\FormEvents;
    
    $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
        $data = $event->getData();
    
        if (!$data) {
            return;
        }
    
        $categoryId = $data['category'];
    
        // Do nothing if the category with the given ID exists
        if ($this->em->getRepository(Category::class)->find($categoryId)) {
            return;
        }
    
        // Create the new category
        $category = new Category();
        $category->setName($categoryId);
        $this->em->persist($category);
        $this->em->flush();
    
        $data['category'] = $category->getId();
        $event->setData($data);
    });
    
    0 讨论(0)
  • 2021-02-05 15:41

    The problem is in a choice transformer, which erases values that don't exist in a choice list.
    The workaround with disabling the transformer helped me:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('choiceField', 'choice', ['choices' => $someList]);
    
        // more fields...
    
        $builder->get('choiceField')->resetViewTransformers();
    }
    
    0 讨论(0)
  • 2021-02-05 16:06

    No, there is not.

    You should implement this manually by either:

    • using the select2 events to create the new choice via ajax
    • catching the posted options before validating the form, and add it to the options list
    0 讨论(0)
提交回复
热议问题