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

grz*_*hoo 9 php symfony-forms symfony twig

如何在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
            ));
    }
Run Code Online (Sandbox Code Playgroud)

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

{{ form_widget(form.transport.road) }}
{{ form_widget(form.transport.train) }}
Run Code Online (Sandbox Code Playgroud)

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

{{ form_widget(form.transport[0]) }}
{{ form_widget(form.transport[1]) }}
Run Code Online (Sandbox Code Playgroud)

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

我试过offsetGet(应该这样return a child by name),但它也适用于数组索引.

小智 10

试试这个:

{% for key, transportItem in form.transport.children %}
    {{ form_widget(transportItem) }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码片段可以解决问题,但[包括解释](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而那些人可能不知道您建议代码的原因。 (2认同)

tft*_*ftd 0

看来最新版本的 Symfony(即 >= 2.6)不可能做到这一点。我记得在以前的版本中,当表单生成器显示数组时choices,它会生成如下选择:

<select>
    <option value="road">Car/Bus</option>
    <option value="train">Train</option>
</select>
Run Code Online (Sandbox Code Playgroud)

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

<select>
    <option value="0">Car/Bus</option>
    <option value="1">Train</option>
</select>
Run Code Online (Sandbox Code Playgroud)

value然后,所选选项将被标准化,然后您将获得在课堂上设置的期望值FormType。您可以在此处阅读有关标准化的更多信息。

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