Определите, какая форма RadioType была выбрана в контроллере

У меня есть форма с несколькими RadioTypes для представления категории объекта Announcement.

$builder
->add('info', RadioType::class,
            [
                'label_attr' => ['class' => 'sr-only'],
                'required' => false
            ])

        ->add('star', RadioType::class,
            [
                'label_attr' => ['class' => 'sr-only'],
                'required' => false
            ])

Я планирую иметь 8 различных радиотипов для 8 вариантов. Как лучше всего определить, какой RadioType был выбран. Моя текущая реализация состоит в том, чтобы иметь оператор if для каждого, но это кажется плохим решением.

if ($form->getData()['info'] == true) {
            //do stuff
        }
        if ($form->getData()['star'] == true) {
            //do stuff
        }

Почему if кажется плохим решением? Вместо этого вы можете использовать оператор switch, хотя они семантически идентичны.

miken32 18.03.2019 22:46

Если у вас есть 8 радиовходов, и вы хотите, чтобы пользователи могли выбирать только один за раз, то нет причин использовать JS. Так работают радиовходы по умолчанию. Это то, для чего они нужны. Просто дайте им одно и то же имя, но разные значения.

M. Eriksson 18.03.2019 22:58

Проблема @MagnusEriksson в том, что их код генерирует кучу несвязанных переключателей с разными именами, поэтому они вообще не связаны.

miken32 18.03.2019 23:02

@ miken32 - Если они не сделают так, как вы предложили в своем ответе :-)

M. Eriksson 18.03.2019 23:09

@MagnusEriksson Я действительно попробовал предложенный ответ, но это усложнило стиль (см. Мой комментарий к ответу)

d1596 18.03.2019 23:45

Обратите внимание, что это также относится к вашему собственному ответу, который должен быть помечен как принятый, если это решение, которое вы выбрали.

miken32 12.04.2019 00:31
Стоит ли изучать 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 и хотите разрабатывать...
1
6
231
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Согласно документации, обычно вам не следует использовать RadioType напрямую. Использование ChoiceType объект позволяет вам следовать ожидаемым стандартам HTML, то есть вы используете одно и то же имя, но разные значения для каждого элемента. Таким образом, браузер, как всегда в случае с переключателями, автоматически ограничивает пользователя одним выбором.

<?php
$builder->add('yourCategory', ChoiceType::class, [
    'choices' => [
        'Info' => 'info',
        'Star' => 'star',
        'Some other label' => 'other',
    ],
    // attributes for label elements
    'label_attr' => ['class' => 'sr-only'],
    // attributes for input elements
    'choice_attr' => [
        'Info' => ['class' => 'fa fa-info'],
        'Star' => ['class' => 'fa fa-star'],
        'Some other label' => ['class' => 'whatever'],
     ],
    // setting these options results in radio buttons
    // being generated, instead of a select element
    'expanded' => true,
    'multiple' => false,
]);

Затем в вашем контроллере:

switch($form->getData()['yourCategory']) {
    case 'info':
        // do stuff
        break;
    case 'star':
        // do stuff
        break;
    case 'other':
        // do stuff
        break;
}

Я пытался реализовать это таким образом, проблема заключалась в том, что это очень усложняло стиль. По сути, я хочу скрыть метки и использовать только значки Font Awesome в качестве «переключателей». насколько мне известно, это невозможно с ChoiceType

d1596 18.03.2019 23:44

@ d1596 - Вы могли бы просто пропустить конструктор форм и написать переключатели вручную? Если это мешает вам больше, чем помогает, то вы не должны его использовать.

M. Eriksson 18.03.2019 23:47

@ d1596 опция label_attr должна быть доступна, чтобы делать то же самое, что и в исходном коде. Или, как предлагает Магнус, просто вводите данные вручную.

miken32 18.03.2019 23:48

@ miken32 вариант label_attr изменит только одну метку для всей формы выбора, не так ли? Мне нужна уникальная иконка для каждого выбора

d1596 18.03.2019 23:57

@ d1596 Не знаю, ты пробовал? Из того, что я вижу в примерах, невозможно указать «единую метку для всей формы выбора», поэтому это не похоже на то, что это связано. Вы можете указать атрибуты для каждого входа, но не похоже, что вы можете сделать это для каждой метки.

miken32 19.03.2019 00:05

Таким образом, я смог вручную изменить метку каждого отдельного выбора.

{# Manually set the label for each choice in the form, so only an icon is shown #}
        <label for = "{{ form.choices.children[0].vars.id}}" class = "mt-2">
            <span class = "fa-stack fa-2x type-icon" id = "info-type">
                <span class = "fas fa-circle fa-stack-2x circle"></span>
                <span class = "info fas fa-info fa-stack-1x"></span>
            </span>
         </label>

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