如何以 Symfony 形式制作 RadioButton?

How to make RadioButton in Symfony Form?

我有一个表格,我必须用 Symfony 表格重做,但我停留在这个地方:

<div class="currency-label">
    <input checked id="cur1" name="currency" type="radio">
    <label for="cur1">EURO</label>
</div>
<div class="currency-label active">
    <input id="cur2" name="currency" type="radio">
    <label for="cur2">USD</label>
</div>

这是它的样子:

如何使用 Symfony Forms 制作单选按钮? 在我的表格 class 中,我添加了:

->add('vacancyCurrency', RadioType::class, ['required' => false])

和我的模板

{{ form_widget(form.vacancyCurrency) }}

我的表格变短了,显然没有了 css : 如果我添加 css class 以形成它看起来不同:

{{ form_widget(form.vacancyCurrency, {'attr':
      {'class': 'currency-label'}
}) }}

最好的方法是将 ChoiceType 呈现为单选按钮:

->add(
    'vacancyCurrency', 
    ChoiceType::class, 
    [
        'choices' => [
            'US Dolar' => 'usd',
            'Euro' => 'eur',
        ],
    'expanded' => true
    ]
);

当您有选项 multiple = falseexpanded = true 时,它呈现为单选按钮的 ChoiceType 字段。选项 multiple 没有出现在上面的代码中,因为它的默认值为 false。您可以找到更多详细信息 here

编辑:

在你的树枝模板中,你只需要添加:

{{ form_widget(form.vacancyCurrency) }}

编辑 2

你在这个答案的评论中说你需要将每个单选按钮放在 <div class="currency-label active"> 中。我相信您不能通过在 Symfony 表单字段本身中设置属性来做到这一点。你在那里的选项,比如 choice_attrinput 中运行,而不是在它周围的 div 中运行。

可以实现您想要的效果,但您需要编写一些代码并手动呈现单选按钮,例如:

<div class="form-group">
    <label class="control-label required">Vacancy currency</label>
    {% for child in form.vacancyCurrency %}
        <div class="currency-label active">
            <label for="{{ child.vars.id }}" class="required">
                <input type="radio" id="{{ child.vars.id }}" name="{{ form.vars.id ~ '[' ~ form.vacancyCurrency.vars.name ~ ']' }}" required="required" class="checkbox" value="{{ child.vars.label }}">
                {{ child.vars.label }}
            </label>
        </div>
    {% endfor %}
</div>

当然,您可以使用一些 Javascript 来完成这项工作。例如,您可以像这样呈现表单字段:

{{ form_widget(form.vacancyCurrency) }}

它将在 div 和 class="radio" 内添加每个单选按钮。

然后您可以在页面准备好后立即将 class 更改为您想要的 JQuery:

$(document).ready(function() {
    $(".radio").attr("class", "currency-label active");
});

这就是我在模板中解决这个问题的方法:

 {{ form_start(form) }}
 {% form_theme form _self %}
 {% block choice_widget %}
     {% for child in form.vacancyCurrency %}
         <div class="currency-label">
             {{- form_widget(child) -}}
             {{- form_label(child, null) -}}
         </div>
     {% endfor %}
 {% endblock choice_widget %}
 {{ form_end(form) }}

格式为class:

->add('vacancyCurrency', ChoiceType::class, [
    'choices' => [
        'USD' => 'USD',
        'RUB' => 'RUB',
    ],
    'expanded' => true,
])

为了激活其中之一,我在模型中设置了默认数据:

public $vacancyCurrency = 'RUB';

Update

现在我有了货币界面并以 class:

的形式使用它
->add('currency', ChoiceType::class, [
    'label' => 'Валюта',
    'choices' => \array_combine(CurrencyInterface::ALL, CurrencyInterface::ALL)
])