bar*_*can 8 forms collections one-to-many symfony
我有一个实体用户和一个实体地址.用户和地址之间存在一对多的关系:
class User
{
/**
* @orm:OneToMany(targetEntity="Address")
*/
protected $adresses;
[...]
}
Run Code Online (Sandbox Code Playgroud)
我有一个类AddressType和类UserType:
class UserType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('addresses', 'collection', array('type' => new AddressType()));
}
[...]
}
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,我构建表单:
$form = $this->get('form.factory')->create(new UserType());
Run Code Online (Sandbox Code Playgroud)
...并创建视图:
return array('form' => $form->createView());
Run Code Online (Sandbox Code Playgroud)
我在我的树枝模板中显示表单字段:
{{ form_errors(form.name) }}
{{ form_label(form.name) }}
{{ form_widget(form.name) }}
[...]
Run Code Online (Sandbox Code Playgroud)
好的.现在,如何显示一个或多个地址的字段?(这{{ for_widget(form.adresses.zipcode) }}不是{{ for_widget(form.adresses[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 %}
Run Code Online (Sandbox Code Playgroud)
我有一个由jQuery驱动的小动作栏,允许用户添加和删除地址.这是一个简单的脚本,使用正确的HTML代码将新div添加到容器中.对于HTML,我只使用相同的输出具有Symfony但具有更新的索引.例如,这将是AddressType表单的街道输入文本的输出:
<input id="user_addresses_0_street" name="user[addresses][0][street]" ...>
然后,Symfony接受的下一个索引是1,因此您添加的新输入字段将如下所示:
<input id="user_addresses_1_street" name="user[addresses][1][street]" ...>
注意:这三个点是重新进行的,required="required" maxlength="255"但可能会根据您的需要而改变.
你需要更多的HTML代码,而不是AddressType在浏览器的DOM中添加一个全新的代码,但这会给你一般的想法.
问候,
马特
我应该补充一点,如果你想动态添加字段,你需要在UserType的集合字段中将键'allow_add'设置为true:
...
$builder->add('addresses', 'collection', array(
'type' => new AddressType(),
'allow_add' => true
));
Run Code Online (Sandbox Code Playgroud)
花了好几个小时试图找出遗失的东西,当时我正在编写文档但还没有提到这一点.希望它能帮助开发人员.