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
。我编辑了我的答案来修正这个错误。