允许向 ChoiceType 字段添加新值

Allow the addition of new values to a ChoiceType Field

我使用 Form Component 并在呈现到 select 字段的表单上有一个 ChoiceType field。 在客户端,我使用 select2 plugin 初始化 select 和 tags: true 允许向其添加新值。
但是如果我添加一个新值然后服务器上的验证失败并出现错误

This value is not valid.

因为新值不在选择列表中。

有没有办法允许向 ChoiceType field 添加新值?

没有,没有。

您应该通过以下任一方式手动实施:

  • 使用 select2 事件通过 ajax
  • 创建新选择
  • 在验证表单之前捕获发布的选项,并将其添加到选项列表

问题出在选择转换器中,它会删除选择列表中不存在的值。
The workaround with disabling the transformer 帮助了我:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('choiceField', 'choice', ['choices' => $someList]);

    // more fields...

    $builder->get('choiceField')->resetViewTransformers();
}

这是一个示例代码,以防有人需要此代码用于 EntityType 而不是 ChoiceType。将此添加到您的 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);
});