首页 > 解决方案 > Symfony - 通过引用访问表单名称

问题描述

我有一个包含许多问题的表格。它们不绑定到实体,因此在表单类型类中动态生成

class QuestionnaireType extends AbstractType
{
    private $questions = [
        0 => 'Question 1',
        1 => 'Question 2',
        2 => 'Question 3',
    ];

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        foreach ($this->questions as $key => $val) {
            $builder->add($key, ChoiceType::class, [
                'choices' => [
                    1 => 'Yes',
                    2 => 'No',
                ]
            ]);
        }
    }
}

我想循环访问我的树枝模板中的这些表单元素。我尝试了以下方法,但它不起作用:

{% block content %}
    {{ form_start(form) }}
    {{ form_errors(form) }}
    {% for i in 0..2 %}
        {{ form_label(form.i) }}
        {{ form_widget(form.i) }}
    {% endfor %}
    {{ form_end(form) }}
{% endblock %}

是否可以从树枝模板中通过引用访问表单元素?

标签: symfonytwigsymfony-forms

解决方案


form.i不起作用,因为您没有名为 的表单字段i,并且当通过 访问数组或对象属性时foo.bar,Twig 不会尝试将其解释bar为变量。

这就是说,您还可以通过语法访问数组键和对象属性foo[bar]wherebar 将始终被解释为变量,然后 wherefoo['bar']将等效于foo.bar.
所以在你的情况下,form[i].

所以这应该适用于你的情况:

{% block content %}
    {{ form_start(form) }}
    {{ form_errors(form) }}
    {% for i in 0..2 %}
        {{ form_label(form[i]) }}
        {{ form_widget(form[i]) }}
    {% endfor %}
    {{ form_end(form) }}
{% endblock %}

另一种解决方案是使用该attribute功能:

{% block content %}
    {{ form_start(form) }}
    {{ form_errors(form) }}
    {% for i in 0..2 %}
        {{ form_label(attribute(form, i)) }}
        {{ form_widget(attribute(form, i)) }}
    {% endfor %}
    {{ form_end(form) }}
{% endblock %}

推荐阅读