Symfony 2.6 - 按名称呈现个人选择字段(收音机,复选框)

时间:2015-01-13 15:20:16

标签: php symfony twig symfony-forms

如何在Symfony 2.6中的Twig中渲染单个字段(单个收音机/复选框输入字段)?

假设我有一个简单的形式:

class TransportType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
            $builder->add('transport', 'choice', array(
                'choices' => array(
                    'road' => 'Car/bus',
                    'train' => 'Train',
                ),
                'expanded' => true,
                'multiple' => false
            ));
    }

在以前的Symfony2版本中,我可以使用:

{{ form_widget(form.transport.road) }}
{{ form_widget(form.transport.train) }}

渲染单个单选按钮,但它似乎不再起作用。我知道我可以使用:

{{ form_widget(form.transport[0]) }}
{{ form_widget(form.transport[1]) }}

但它的灵活性较差。当然,我可以迭代收集并检查名称,但这似乎是不必要的麻烦。是不是有更简单的方法?

我尝试offsetGet(应该是return a child by name),但它也适用于数组索引。

4 个答案:

答案 0 :(得分:10)

试试这个:

{% for key, transportItem in form.transport.children %}
    {{ form_widget(transportItem) }}
{% endfor %}

答案 1 :(得分:1)

在我自己的项目中使用的解决方案

{{form_label(form.transport)}}

 {% for key, item in form.transport.children %}
    <div class="custom-radio">
        <label for="{{item.vars.id}}">{{item.vars.label}}</label>
        <input 
            type="radio" 
            value="{{item.vars.value}}" 
            id=" {{item.vars.id}}" 
            name="{{item.vars.full_name}}" 
           {{ item.vars.checked ? 'checked' : '' }} 
        >
   </div>
{% endfor %}

或者您可以使用表单主题

{% form_theme form _self %}

{%- block choice_widget_expanded -%}
    {%- for child in form %}
        <div class="custom-radio">
            {{- form_label(child) -}}
            {{- form_widget(child) -}}
        </div>
    {% endfor -%}
{%- endblock choice_widget_expanded -%}


{{form_widget(form)}}

答案 2 :(得分:0)

对于Symfony的最新版本(即&gt; = 2.6),这似乎是不可能的。我记得在以前的版本中,当表单生成器显示choices数组时,它正在生成如下选项:

<select>
    <option value="road">Car/Bus</option>
    <option value="train">Train</option>
</select>

然而,这在最近的版本中已经改变为以下内容:

<select>
    <option value="0">Car/Bus</option>
    <option value="1">Train</option>
</select>

然后对所选选项进行规范化,然后获得value类中设置的预期FormType。您可以阅读有关规范化here的更多信息。

此外,如果您在Symfony&gt; = 2.6中编写{{ debug(form.transport) }},您可以看到表单/字段数组以及可以从中使用的内容。

答案 3 :(得分:0)

从Symfony 2.7开始,您可以通过choice_name选项设置选择表单名称。