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

Php Symfony 2.6-按名称呈现个人选择字段(收音机、复选框),php,symfony,twig,symfony-forms,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(

如何在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
(它应该
按名称返回子项
),但它也只适用于数组索引。

最新版本的Symfony(即>=2.6)似乎无法实现这一点。我记得在以前的版本中,当表单生成器显示
选项
数组时,它生成的选项如下:

<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>

汽车/公共汽车
训练
然后对所选选项进行规范化,然后获得在
FormType
类中设置的预期
值。您可以阅读更多关于规范化的内容

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

试试这个:

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

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

{{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_标签(form.transport)}
{%表示键,项的形式为.transport.children%}
{{item.vars.label}
{%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)}}
{%form\u主题表单\u self%}
{%-block choice_widget_expanded-%}
{%-用于格式为%]的子级
{{-form_标签(子)-}
{{-form_小部件(子)-}
{%endfor-%}
{%-endblock choice_widget_expanded-%}
{{form_widget(form)}

虽然这个代码片段可以解决这个问题,但它确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。这不起作用,因为ChoiceView没有id和全名属性。我认为您必须从FormView对象获取名称,并使用当前选项视图的键从FormView的id构建id。类似于:id的form.transport.id~'''.'键和from.transport.full_名称对于所有选项都是相同的。