【问题标题】:Symfony2 - default values in Form Collection prototypeSymfony2 - 表单集合原型中的默认值
【发布时间】:2011-09-21 16:58:21
【问题描述】:

我试图让集合原型具有一组默认值而不是空白值。理想情况下,我希望能够在模型类或表单定义类中的某处定义这些默认值,但我无法找到在任何地方执行此操作的方法。

举个例子:

我为我的表单创建了一个 AbstractType,其中包含一个嵌套的 Person 行集合(相关代码如下所示):

public function buildForm(FormBuilder $builder, array $options)
{
    ...
    $builder->add('people', 'collection', array(
            'type'         => new PersonType(),
            'allow_add'    => true,
            'allow_delete' => true,
            'prototype'    => true,
        ));
    ...
}

PersonType 类包含以下代码:

public function buildForm(FormBuilder $builder, array $options)
{
    $builder->add('name', 'text');
    $builder->add('date_of_birth', 'date');
    $builder->add('age', 'number');

    // This would be great if I could do this but I can't:
    //$builder->add('date_of_birth', 'date', array('empty_value' => new \DateTime(...))); // some default value defined here
}

到目前为止,我能想到的最好的在视图文件中显示如下(显示的代码用于呈现集合原型):

...
<tr>
    <td> {{ form_widget(person.name) }} </td>

    {# THIS DOES NOT WORK (I just get the default selected date) #}
    <td> {{ form_widget(person.date_of_birth, {'value': person.date_of_birth.get('value')|default({'year':2010, 'month':10, 'day':15})} }} </td>

    {# THIS WORKS (the field contains '0' instead of being empty) #}
    <td> {{ form_widget(person.age, {'value': person.age.get('value')|default(0)} }} </td>
</tr>
...
  • 它似乎只适用于文本和数字等简单类型。它不适用于日期类型。
  • 无论如何,这感觉不是正确的方法。我应该能够在基础模型中定义默认/空值(例如模型类中的protected $age = 10;),或者在表单定义(AbstractType)类中(例如数组('empty_value' => new DateTime() ),但目前都不可能。

总之,我的问题是:

如何为模型类定义默认值,当向表单“集合”添加新项目时将在客户端自动设置(而不是仅仅获得空白)。

有谁知道这样做的好方法吗?

【问题讨论】:

  • $builder-&gt;add('items', CollectionType::class, array( 'entry_type' =&gt; ItemType::class, 'allow_add' =&gt; true, 'allow_delete' =&gt; true, 'prototype' =&gt; true, 'prototype_data' =&gt; new ItemData(), ))

标签: symfony


【解决方案1】:

在使用表单的实体的构造函数中,您只需使用 \DateTime 对象设置日期,如下所示:

class MyEntity {
    private $myDate;

    public function __construct() {
        $this->myDate = new \DateTime('today'); 
    }
}

您也可以使用 \DateTime('now') 或 \DateTime('tomorrow'),如下面的讨论所述

http://groups.google.com/group/symfony2/browse_thread/thread/18a5b20aca485dc4/e9947d0f06d6519d

编辑:实际上,这些信息在 symfony2 文档中:

http://symfony.com/doc/2.0/book/forms.html#building-the-form

【讨论】:

  • 这正是我最终所做的并且完美地工作。谢谢!
【解决方案2】:

可能

$builder->setData(array('date_of_birth', new \DateTime(...)));

【讨论】:

  • 不幸的是,这不起作用。似乎$builder-&gt;setData(...) 采用单个参数,其中包含映射到该表单类型的类的实例(即在getDefaultOptions 中的data_class 中定义)。然后将此实例用作表单的默认值。我通过使用默认值初始化我的实体类解决了我的问题。
【解决方案3】:

使用 Symfony >2.0 这是不可能的。

Symfony 2.0 从底层对象检索原型的值,因此在构造函数中设置它们也改变了原型中的值。然而,Symfony 2.1 改变了这种行为,移除了这个功能,使我们无法为原型设置默认值:

我认为现在确实不可能为原型设置默认值。 --webmozart,Symfony 合作者 (https://github.com/symfony/symfony/issues/5087)

有一个open bug 正在积极开发中,应该会增加对data_prototype 选项的支持。使用此选项,可以提供数据以预填充原型。然而,这可能会在 Symfony 2.7 之前发布。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多