Я работаю над Symfony 3.4, и у меня есть 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")
))
Таким образом, пользователь может выбрать 2 булевых значения Да / Нет в моей форме, и мне нужна проверка (проверка PHP в бэкэнде, а не впереди), как будто выбран хотя бы один из этих двух булевых значений.
Так что, если оба установлены на NO, возникает ошибка: «Вы должны выбрать по крайней мере first_boolean или second_boolean»
Какой лучший способ сделать это?
Спасибо !
Хорошо, если у вас есть только тип формы и нет базового типа формы, вы можете добавить простой Ограничение выражения:
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',
))
]
));
}
Обратите внимание, как в выражении второе или содержит ссылку на другое поле. Таким образом, оба поля получают «ошибку». Если это слишком много, вы можете просто удалить одно ограничение, и только одно поле будет выделено с ошибкой.
Если ваша форма поддерживается классом данных, вы, конечно, можете добавить ограничение Expression к этому классу:
/**
* @Assert\Expression(
* "this.getisMyFirstBoolean() or this.getisMySecondBoolean()",
* message="Either first or second boolean have to be set",
* )
*/
class MyFormData
В этом случае сообщение об ошибке отображается на уровне формы.
Других решений пока нет …