У меня есть форма с несколькими 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
}
Если у вас есть 8 радиовходов, и вы хотите, чтобы пользователи могли выбирать только один за раз, то нет причин использовать JS. Так работают радиовходы по умолчанию. Это то, для чего они нужны. Просто дайте им одно и то же имя, но разные значения.
Проблема @MagnusEriksson в том, что их код генерирует кучу несвязанных переключателей с разными именами, поэтому они вообще не связаны.
@ miken32 - Если они не сделают так, как вы предложили в своем ответе :-)
@MagnusEriksson Я действительно попробовал предложенный ответ, но это усложнило стиль (см. Мой комментарий к ответу)
Обратите внимание, что это также относится к вашему собственному ответу, который должен быть помечен как принятый, если это решение, которое вы выбрали.






Согласно документации, обычно вам не следует использовать 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 - Вы могли бы просто пропустить конструктор форм и написать переключатели вручную? Если это мешает вам больше, чем помогает, то вы не должны его использовать.
@ d1596 опция label_attr должна быть доступна, чтобы делать то же самое, что и в исходном коде. Или, как предлагает Магнус, просто вводите данные вручную.
@ miken32 вариант label_attr изменит только одну метку для всей формы выбора, не так ли? Мне нужна уникальная иконка для каждого выбора
@ d1596 Не знаю, ты пробовал? Из того, что я вижу в примерах, невозможно указать «единую метку для всей формы выбора», поэтому это не похоже на то, что это связано. Вы можете указать атрибуты для каждого входа, но не похоже, что вы можете сделать это для каждой метки.
Таким образом, я смог вручную изменить метку каждого отдельного выбора.
{# 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>
Почему
ifкажется плохим решением? Вместо этого вы можете использовать операторswitch, хотя они семантически идентичны.