Определите, какая форма RadioType была выбрана в контроллере - PullRequest
1 голос
/ 19 марта 2019

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

Согласно документации , обычно не следует использовать 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;
}
0 голосов
/ 20 марта 2019

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

{# 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>
...