2012-01-03 53 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; 
     } 
    )); 

此解決方案將行爲應用於此表單,它不會將此行爲耦合到實體本身。您可能有幾種表單修改具有不同所需行爲的實體。有些需要默認日期,有些則不需要。

相關問題