Я работаю над Symfony 3.4, и у меня есть FormType с кратными полями и 2 логическими значениями, например:
->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
В этом случае сообщение об ошибке отображается на уровне формы.
Какую версию PHP вы используете? Вы пробовали это с value == "1" вместо value == 1 (т.е. сравнивать со строками)?
Ммм, не знаю почему, но это утверждение не работает для меня, я могу выразить что угодно, это всегда нормально