8

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

    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()));

        }

        [...]
    }

在我的控制器中,我使用以下方式构建表单:

    $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_widget(form.adresses.zipcode) }}也不是{{ for_widget(form.adresses[0].zipcode) }}……)

有任何想法吗 ?

4

2 回答 2

7

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

{{ 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 %}

我有一个由 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 代码来向浏览器的 DOM 添加一个全新AddressType的内容,但这给了您大致的想法。

问候,
马特

于 2011-05-10T22:08:54.590 回答
5

我应该补充一点,如果您想动态添加字段,您需要在 UserType 的集合字段中将键 'allow_add' 设置为 true:

...

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

只是花了几个小时试图找出丢失的东西,而在我写文档的时候还没有提到这一点。希望对开发者有所帮助。

于 2011-07-21T16:03:50.197 回答