在我的表单中有一个名为*sub_choice*的选择字段类型,它的选择将根据父选择字段*parent_choice*的选定值通过AJAX动态加载。加载选择非常有效,但在提交时验证sub_choice的值时遇到问题。它会给出一个"This value is not valid“验证错误,因为提交的值在构建时不在sub_choice字段的选项中。那么,有没有一种方法可以正确地验证sub_choice字段的提交值呢?下面是构建我的表单的代码。我使用的是Symfony 2.1。
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('parent_choice', 'entity', array(
'label' => 'Parent Choice',
'class' => 'Acme\TestBundle\Entity\ParentChoice'
));
$builder->add('sub_choice', 'choice', array(
'label' => 'Sub Choice',
'choices' => array(),
'virtual' => true
));
}
发布于 2014-04-16 17:34:48
要执行此操作,您需要在提交表单之前覆盖sub_choice
字段:
public function buildForm(FormBuilderInterface $builder, array $options)
{
...
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
$parentChoice = $event->getData();
$subChoices = $this->getValidChoicesFor($parentChoice);
$event->getForm()->add('sub_choice', 'choice', [
'label' => 'Sub Choice',
'choices' => $subChoices,
]);
});
}
发布于 2015-01-31 15:57:56
这可以接受任何值
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
$data = $event->getData();
if(is_array($data['tags']))$data=array_flip($data['tags']);
else $data = array();
$event->getForm()->add('tags', 'tag', [
'label' => 'Sub Choice',
'choices' => $data,
'mapped'=>false,
'required'=>false,
'multiple'=>true,
]);
});
发布于 2013-08-14 18:52:06
您不能构建sub_choice验证,因为在配置其验证器期间,您不知道哪些值是有效的(值取决于parent_choice的值)。
您可以做的是在控制器中创建新的YourFormType()之前将parent_choice解析为entity。然后,您可以获得新的所有可能的值,并通过表单构造函数- sub_choice YourFormType($subChoice)提供它们。
在YourFormType中,你必须像这样添加__construct方法:
/**
* @var array
*/
protected $subChoice = array();
public function __construct(array $subChoice)
{
$this->subChoice = $subChoice;
}
并使用表单add中提供的值:
$builder->add('sub_choice', 'choice', array(
'label' => 'Sub Choice',
'choices' => $this->subChoice,
'virtual' => true
));
https://stackoverflow.com/questions/12946461
复制相似问题