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

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

Как лучше всего это сделать?

Спасибо !

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
529
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Ммм, не знаю почему, но это утверждение не работает для меня, я могу выразить что угодно, это всегда нормально

Clément Andraud 14.06.2018 17:11

Какую версию PHP вы используете? Вы пробовали это с value == "1" вместо value == 1 (т.е. сравнивать со строками)?

vstm 14.06.2018 17:22

Другие вопросы по теме