允许向 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);
});
我使用 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);
});