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

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

        }

        [...]
    }

在我的 Controller 中,我使用以下命令构建表单:
    $form = $this->get('form.factory')->create(new UserType());

...并使用创建 View :
    return array('form' => $form->createView());

我在 Twig 模板中显示以下表单字段:
    {{ form_errors(form.name) }}
    {{ form_label(form.name) }}
    {{ form_widget(form.name) }}
    [...]

好的。现在,如何显示一个或多个地址的字段? (既不是{{ 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 %}

我有一个由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"的替换,但可以根据需要进行更改。

与向浏览器DOM中添加一个全新的AddressType相比,您将需要更多的HTML代码,但这为您提供了总体思路。

问候,
马特

关于forms - 如何处理Symfony2 Beta上的Form Collection?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5894570/

10-13 07:32