Forms 如何处理Symfony2测试版上的表单收集?

Forms 如何处理Symfony2测试版上的表单收集?,forms,collections,symfony,one-to-many,Forms,Collections,Symfony,One To Many,我有一个实体用户和一个实体地址。用户和地址之间存在一对多的关系: class User { /** * @orm:OneToMany(targetEntity="Address") */ protected $adresses; [...] } 我有一个类AddressType和类UserType: class UserType extends AbstractType

我有一个实体用户和一个实体地址。用户和地址之间存在一对多的关系:

    class User
    {
        /**
        * @orm:OneToMany(targetEntity="Address")
        */
        protected $adresses;

        [...]

    }
我有一个类AddressType和类UserType:

    class UserType extends AbstractType
    {
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder->add('addresses', 'collection', array('type' => new AddressType()));

        }

        [...]
    }
...

$builder->add('addresses', 'collection', array(
    'type' => new AddressType(),
    'allow_add' => true
));
在我的控制器中,我使用以下内容构建表单:

    $form = $this->get('form.factory')->create(new UserType()); 
。。。并使用以下内容创建视图:

    return array('form' => $form->createView());
我在我的小树枝模板中显示表单字段,其中包含:

    {{ form_errors(form.name) }}
    {{ form_label(form.name) }}
    {{ form_widget(form.name) }}
    [...]
好的。现在,如何显示一个或多个地址的字段?(它不是
{{for_小部件(form.adreses.zipcode)}
也不是
{{{for_小部件(form.adreses[0.zipcode)}}


有什么想法吗

这是我在表单模板中所做的:

{{ form_errors(form.addresses) }}

{% for address in form.addresses %}
    <div id="{{ 'address%sDivId'|format(loop.index) }}" class="userAddressItem">
        <h5> Address #{{ loop.index }}</h5>

        {{ form_errors(address) }}
        {{ form_widget(address) }}
    </div>
{% endfor %}
{{form_errors(form.addresses)}
{%用于form.addresses%}
地址#{loop.index}
{{格式错误(地址)}
{{form_widget(address)}
{%endfor%}
我有一个由jQuery驱动的小操作栏,它允许用户添加和删除地址。它是一个简单的脚本,用正确的HTML代码将一个新的div附加到容器中。对于HTML,我只是使用了相同的输出has Symfony,但是使用了更新的索引。例如,这将是
AddressType
表单的街道输入文本的输出:

然后,下一个索引Symfony将接受1,因此您添加的新输入字段如下所示:

注意:这三个点是
required=“required”maxlength=“255”
的位置,但可能会根据您的需要而改变

在浏览器的DOM中添加一个全新的
AddressType
,您需要更多的HTML代码,但这给了您一个大致的想法

问候,

Matt

我应该补充一个事实,即如果要动态添加字段,需要在UserType中的集合字段中将键“allow_add”设置为true:

    class UserType extends AbstractType
    {
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder->add('addresses', 'collection', array('type' => new AddressType()));

        }

        [...]
    }
...

$builder->add('addresses', 'collection', array(
    'type' => new AddressType(),
    'allow_add' => true
));

只是花了几个小时试图找出遗漏了什么,而在我写文档的时候,还没有提到这一点。希望它能帮助其他开发人员。

示例代码中的拼写非常不一致;您是否确保在您的开发环境中正确拼写事物(变量名、函数等)?谢谢!它帮助我调试代码。Symfony2成功生成字段,包括一个模式(具有索引
$$name$$$
)。它必须被隐藏并用于向用户显示空的组字段,索引为0、1、2…很好,同时也感谢您提供的关于该模式的提示。我没有考虑过使用原型作为新领域的简单seachr和replace模式。这是一个好主意,它将减少我的js代码。竖起大拇指!仅供参考,是“地址”而不是“地址”谢谢,我习惯用法语写,拼写为
adrese
。我编辑了我的答案来修正这个错误。