如何在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
),但它也仅适用于数组索引。
试试这个:
{% 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_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)}}
这
似乎在最新版本的Symfony(即>= 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>
然后,所选选项将规范化,然后获得在FormType
类中设置的预期value
。您可以在此处阅读有关规范化的更多信息。
此外,如果你用Symfony>= 2.6编写{{ debug(form.transport) }}
,你可以看到表单/字段数组以及你可以从中使用什么。