问题
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 setting tags: true
wich allows to add a new value in it.
But if I add a new value then a validation on a server will fail with error
This value is not valid.
because the new value isn't in a choice list.
Is there a way to allow adding of a new value to choice a Field Type?
回答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();
}
回答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);
});
回答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
来源:https://stackoverflow.com/questions/32628035/allow-to-add-a-new-value-in-a-choice-field-type