【问题标题】:How to deal with Form Collection on Symfony2 Beta?如何处理 Symfony2 Beta 上的表单收集?
【发布时间】:2011-05-05 08:11:57
【问题描述】:

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

    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) }} ...)

有什么想法吗?

【问题讨论】:

  • 您的拼写在您的示例代码中非常不一致;您确定在您的开发环境中正确拼写事物(变量名、函数等)吗?

标签: forms collections symfony one-to-many


【解决方案1】:

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

{{ 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 表单的街道输入文本的输出:

&lt;input id="user_addresses_0_street" name="user[addresses][0][street]" ...&gt;

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

&lt;input id="user_addresses_1_street" name="user[addresses][1][street]" ...&gt;

注意:三个点是required="required" maxlength="255" 的替代品,但可以根据您的需要进行更改。

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

问候,
马特

【讨论】:

  • 谢谢!它帮助我调试我的代码。 Symfony2 成功生成字段,包括一个模式(索引为$$name$$)。它必须被隐藏并用于向用户显示空组字段,索引为 0、1、2 ...
  • 很好,也感谢关于模式的提示。我没有考虑使用原型作为模式来轻松搜索和替换新字段。这是一个好主意,它将减少我的 js 代码。竖起大拇指!
  • 仅供参考,它是“地址”而不是“地址”
  • 谢谢,我习惯用法语写它,拼写为adresse。我编辑了我的答案来修正这个错字。
【解决方案2】:

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

...

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多