Symfony FormType 至少选择了一个收音机
Symfony FormType at least one radio selected
我正在使用 Symfony 3.4,我有一个带有多个字段和 2 个布尔值的 FormType,例如:
->add("is_my_first_boolean", ChoiceType::class, array(
"expanded" => true,
"multiple" => false,
"choices" => array(
'Yes' => "1",
'No' => "0"
)
))
->add("is_my_second_boolean", ChoiceType::class, array(
"expanded" => true,
"multiple" => false,
"choices" => array(
'Yes' => "1",
'No' => "0"
)
))
所以用户可以在我的表单上 select 2 个布尔值 Yes/No,而我需要的是验证(PHP 在后端而不是在前端进行验证),例如这两个布尔值中至少有一个是 selected.
所以如果两者都设置为NO,就会出现错误'You must choose at least first_boolean or second_boolean"
最好的方法是什么?
谢谢!
好吧,如果您只有表单类型而没有基础表单类型,您可以添加一个简单的 Expression constraint:
use Symfony\Component\Validator\Constraints as Assert;
....
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add("is_my_first_boolean", ChoiceType::class, array(
"expanded" => true,
"multiple" => false,
"choices" => array(
'Yes' => "1",
'No' => "0"
),
'constraints' => [
new Assert\Expression(array(
'expression' => 'value == 1 or this.getParent()["is_my_second_boolean"].getData() == 1',
'message' => 'Either is_my_first_boolean or is_my_second_boolean must be selected',
))
]
))
->add("is_my_second_boolean", ChoiceType::class, array(
"expanded" => true,
"multiple" => false,
"choices" => array(
'Yes' => "1",
'No' => "0"
),
'constraints' => [
new Assert\Expression(array(
'expression' => 'value == 1 or this.getParent()["is_my_first_boolean"].getData() == 1',
'message' => 'Either is_my_first_boolean or is_my_second_boolean must be selected',
))
]
));
}
注意表达式中的第二个 or 是如何包含对其他字段的引用的。这样两个字段都得到 "error"。如果这太多了,您可以只删除一个约束,并且只有一个字段会突出显示错误。
如果您的表单由数据 class 支持,您当然可以将表达式约束添加到此 class:
/**
* @Assert\Expression(
* "this.getisMyFirstBoolean() or this.getisMySecondBoolean()",
* message="Either first or second boolean have to be set",
* )
*/
class MyFormData
在这种情况下,错误消息显示在表单级别。
我正在使用 Symfony 3.4,我有一个带有多个字段和 2 个布尔值的 FormType,例如:
->add("is_my_first_boolean", ChoiceType::class, array(
"expanded" => true,
"multiple" => false,
"choices" => array(
'Yes' => "1",
'No' => "0"
)
))
->add("is_my_second_boolean", ChoiceType::class, array(
"expanded" => true,
"multiple" => false,
"choices" => array(
'Yes' => "1",
'No' => "0"
)
))
所以用户可以在我的表单上 select 2 个布尔值 Yes/No,而我需要的是验证(PHP 在后端而不是在前端进行验证),例如这两个布尔值中至少有一个是 selected.
所以如果两者都设置为NO,就会出现错误'You must choose at least first_boolean or second_boolean"
最好的方法是什么?
谢谢!
好吧,如果您只有表单类型而没有基础表单类型,您可以添加一个简单的 Expression constraint:
use Symfony\Component\Validator\Constraints as Assert;
....
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add("is_my_first_boolean", ChoiceType::class, array(
"expanded" => true,
"multiple" => false,
"choices" => array(
'Yes' => "1",
'No' => "0"
),
'constraints' => [
new Assert\Expression(array(
'expression' => 'value == 1 or this.getParent()["is_my_second_boolean"].getData() == 1',
'message' => 'Either is_my_first_boolean or is_my_second_boolean must be selected',
))
]
))
->add("is_my_second_boolean", ChoiceType::class, array(
"expanded" => true,
"multiple" => false,
"choices" => array(
'Yes' => "1",
'No' => "0"
),
'constraints' => [
new Assert\Expression(array(
'expression' => 'value == 1 or this.getParent()["is_my_first_boolean"].getData() == 1',
'message' => 'Either is_my_first_boolean or is_my_second_boolean must be selected',
))
]
));
}
注意表达式中的第二个 or 是如何包含对其他字段的引用的。这样两个字段都得到 "error"。如果这太多了,您可以只删除一个约束,并且只有一个字段会突出显示错误。
如果您的表单由数据 class 支持,您当然可以将表达式约束添加到此 class:
/**
* @Assert\Expression(
* "this.getisMyFirstBoolean() or this.getisMySecondBoolean()",
* message="Either first or second boolean have to be set",
* )
*/
class MyFormData
在这种情况下,错误消息显示在表单级别。