'Allow the addition of new values to a ChoiceType Field

I use Form Component and have a ChoiceType field on the form which is rendered to a select field. On the client-side I use select2 plugin which initializes a select with tags: true allowing the addition of new values to it.
But if I add a new value then a validation on the server fails with an error

This value is not valid.

because the new value isn't in the choice list.

Is there a way to allow the addition of new values to a ChoiceType field?



Solution 1:[1]

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();
}

Solution 2:[2]

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);
});

Solution 3:[3]

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

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Community
Solution 2 Taylan
Solution 3 NDM