在Symfony2表单中为Datetime字段设置默认值

51

我有一个表单包含多个字段,其中一个是日期时间字段。如何为该字段定义默认值?

我尝试在相关实体、控制器、构造函数和__construct中设置值:

$myEntity = new MyEntity();
$myEntity->setMyDate(new \DateTime());
$form = $this->createForm(new AddMyEntity(), $myEntity);

不起作用。

在 buildForm 中尝试定义 $data 变量:

$builder->add('myDate', 'date', array(
    'format' => \IntlDateFormatter::SHORT,
    'input' => 'datetime',
    'widget' => 'single_text',
    'data' => new \DateTime("now"));

这也不起作用。有什么想法,Symfony2社区?

编辑:faost的要求添加实体。

/**
 * @ORM\Column(name="myDate", type="datetime")
 * @Assert\NotBlank()
 */
private $myDate;

请展示“MyEntity”类中属性“myDate”的定义,以及“AddMyEntity”表单类型类中方法“buildForm”的定义。 - alexfv
我的问题的第二部分是buildForm方法的一个片段。我会添加实体部分。 - i.am.michiel
你的代码没问题,应该可以工作。但我注意到你在“myDate”字段中使用了datetime doctrine映射类型,所以最好在“AddMyEntity”类中使用datetime字段类型。http://symfony.com/doc/current/reference/forms/types/datetime.html - alexfv
4个回答

75

在实体构造函数中设置:

class Entity
{
    /**
     * @var \DateTime
     */
    private $date;

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

1
+1 @elnur:最近每次我搜索Symfony2相关的问题,你都回答了。谢谢! :) - Darragh Enright
你是如何使其运作的?我也遇到了同样的问题。我正在使用表单集合。 - ncatnow
1
根据 https://github.com/symfony/symfony/issues/5095 和 https://github.com/symfony/symfony/pull/6910,使用实体构造函数中设置的默认值在表单集合中存在限制。 - ncatnow
点赞是因为最好在__construct中添加应该被持久化的默认值。 - Tomkay
在构造函数中,只需将变量分配给字段,不要有任何条件、实例化或其他操作。构造函数应该是无代码的。 - vaso123
显示剩余3条评论

35
Elnur的回答是正确的,也许是推荐的方法。但为了完整起见,在表单中设置日期小部件的默认值的另一种方法是在选项数组参数中指定"data"键,并使用DateTime实例。
$builder->add('myDate', 'date', array(
    'data' => new \DateTime()
));

注意:这将覆盖每次编辑之前设置的日期时间。


8
该方法仅在添加新条目时有效,但在编辑时会失败,因为它没有将数据库的值放在表单上,而是当前时间。 - Masinde Muliro
@MasindeMuliro 正确。我在这里添加了这个答案,因为这个问题是谷歌搜索结果的第一项,并且我的一个场景是,仅通过在构造函数中实例化无法通过测试。如果我记得边缘情况是什么,我会将其添加到答案中。 - Adam Elsodaney
1
谢谢!这对我来说是一个更好的解决方案。我需要将默认日期设置为用户编辑记录的日期,而不是数据库中首次创建的日期。 - Ben Hillier
我必须将date作为第二个参数替换为DateType::class,并添加Symfony\Component\Form\Extension\Core\Type\DateType的使用声明。非常感谢。 - Alberto Méndez

14

这个解决方案不需要修改你的实体对象。

    $builder->add('myDate', DateTimeType::class, [
        'label' => 'My Date',
        'required' => false,
        'date_widget' => 'single_text',
        'time_widget' => 'single_text',
        'date_format' => 'dd/MM/yyyy'
    ]);

    $builder->get('myDate')->addModelTransformer(new CallbackTransformer(
        function ($value) {
            if(!$value) {
                return new \DateTime('now +1 month');
            }
            return $value;
        },
        function ($value) {
            return $value;
        }
    ));

这个解决方案仅将行为应用于此表单,而不将此行为与实体本身耦合。您可能有多个表单,使用不同的必需行为修改实体。有些需要默认日期,而其他则不需要。


-8

您可以将属性设置为on update CURRENT_TIMESTAMP和default to current time stamp,它将自动更新当前时间戳而无需通过查询进行更新。

`feildname` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP

2
如上所述,我正在尝试在表单中设置默认值,而不是在数据库中。我需要向用户建议一个默认值。 - i.am.michiel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接