2012-01-03 86 views
39

我有一个包含几个字段的表单。其中之一是日期时间字段。如何为该字段定义默认值?以symfony2格式在日期时间字段上设置默认值

我试过在相关实体设置一个值,在控制器的构造函数和__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社区?

编辑:添加实体的故障需求。

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

请在类“MyEntity”中显示属性“myDate”的定义以及表单类型为“AddMyEntity”的方法“buildForm”。 – 2012-01-03 15:04:16

+0

我的问题的第二部分是buildForm方法的摘录。我将添加实体部分。 – 2012-01-03 15:51:16

+0

你的代码是好的,它应该可以工作。但我注意到你使用datetime原则映射类型为“myDate”字段,所以最好在“AddMyEntity”类中使用datetime字段类型http://symfony.com/doc/current/reference/forms/types/datetime.html – 2012-01-03 17:18:46

回答

56

将其设置在实体构造:

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

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

正如问题中所述,如果尝试在函数MyEntity()中将其设置为__construct并且未成功。 – 2012-01-03 15:50:15

+0

只是为了完成您的建议,它实际上适用于简单类型:文本,整数等。它不适用于DateTime。 – 2012-01-03 15:53:50

+0

嗯。我在构造函数中初始化'DateTime'对象,它很好用。在你的应用程序的其他地方可能有些问题。 – 2012-01-03 16:40:23

-4

您可以设置属性就更新CURRENT_TIMESTAMP和defualt到当前时间戳将自动更新当前时间戳,而无需通过查询更新

`feildname` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP 
+2

As在上面的问题中说,我试图在窗体中设置一个默认值。不在数据库中。我需要向用户建议一个默认值。 – 2012-01-03 14:09:48

27

Elnur的答案是正确的,也许是推荐的答案。但是为了完整起见,在表单中为日期小部件设置默认值的另一种方法是在选项数组参数中指定data键并使用DateTime实例。

$builder->add('myDate', 'date', array(
    'data' => new \DateTime() 
)); 

注:这将覆盖以前的日期时间设定在每一个编辑。

+6

中的默认值此方法仅在添加新条目时起作用,但在编辑时失败,因为它不会将数据库值放到表单上的当前时间 – 2014-03-02 03:32:25

+0

@MasindeMuliro正确。我在这里添加了这个答案,因为这个问题是Google的第一个结果,并且我有一个场景,在那里测试不会通过在构造函数中实例化来传递。如果我记得边缘案例是什么,我会将其添加到答案中。 – 2014-10-08 08:58:56

+1

谢谢!这对我来说是一个更好的解决方案。我需要默认用户编辑记录的日期,而不是它在数据库中首次创建的日期。 – 2016-01-07 09:29:30

5

此解决方案不需要修改您的实体对象。

$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; 
     } 
    )); 

此解决方案将行为应用于此表单,它不会将此行为耦合到实体本身。您可能有几种表单修改具有不同所需行为的实体。有些需要默认日期,有些则不需要。

相关问题