Symfony FormType выбрал хотя бы одно радио

Я работаю над 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»

Какой лучший способ сделать это?

Спасибо !

2

Решение

Хорошо, если у вас есть только тип формы и нет базового типа формы, вы можете добавить простой Ограничение выражения:

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

В этом случае сообщение об ошибке отображается на уровне формы.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]