2012-01-03 37 views
39

Birkaç alan içeren bir formum var. Bunlardan biri bir Datetime alanıdır. Bu alan için varsayılan değer nasıl tanımlanır? Ben yapıcı ve __construct içinde, denetleyici içinde, ilgili varlık üzerinde bir değer ayarlayarak denedimSymfony2 formundaki Datetime alanında varsayılan değeri ayarlayın

:

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

Çalışmıyor. Ya Çalışmıyor

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

:

buildForm içinde $data değişken tanımlamak için çalıştı. Herhangi bir fikir, Symfony2 topluluğu?

DÜZENLEME: Faost isteğine göre varlık ekleme.

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

Lütfen "myDate" sınıfının "MyEntity" sınıfındaki tanımı ve "AddMyEntity" türünde "buildForm" yöntemini kullanın. –

+0

Sorumun ikinci kısmı, buildForm yönteminin bir özüdür. Ve varlık parçasını ekleyeceğim. –

+0

Kodunuz tamam, işe yaramalı. Ancak "myDate" alanı için datetime doktrin eşleme türünü kullandığınızı fark ediyorum. "AddMyEntity" sınıfında datetime alan türü daha iyi kullanın http://symfony.com/doc/current/reference/forms/types/datetime.html –

cevap

56

Set o güncellemeden otomatik olarak geçerli zaman damgası güncelleyecektir şimdiki zaman damgasına güncelleme CURRENT_TIMESTAMP ve Varsylan üzerinde etmek özelliklerini ayarlayabilirsiniz:

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

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

Soruda söylendiği gibi, başarılı olmadan MyEntity() işlevindeki gibi __construct da ayarlanmaya çalışılırsa. –

+0

Sadece önerinizi tamamlamak için, basit türlerde çalışır: metin, ints vb. DateTime üzerinde çalışmıyor. –

+0

Hmm. 'DateTime' nesnelerini kurucularda başlatıyorum ve harika çalışıyor. Muhtemelen uygulamanızda başka bir yerde yanlış bir şey var. –

-4

Sen varlık kurucusundaki sorgusu

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

As Yukarıdaki soruda, bir formda bir varsayılan değer ayarlamaya çalışıyorum. Veritabanında değil. Kullanıcının varsayılan bir değer önermemesi gerekiyor. –

27

Elnur'ın cevabı doğrudur ve belki de tavsiye edilen biridir. Ancak, tamlık için, bir formdaki bir tarih widget'ının varsayılan değerini belirlemenin alternatif bir yolu, bir dizi DateTime örneğiyle seçenekler dizisi argümanında data anahtarını belirtmektir.

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

Not: Bu daha önce her düzenleme sonrasında tarih saat set üzerine yazılır.

+6

Bu yaklaşım içinde kalıcı olmalıdır varsayılan eklemek daha iyidir yeni bir giriş ekleyerek ama Doğru formu –

+0

@MasindeMuliro veritabanı değerini ancak o anki saati koymak değil çünkü düzenlenirken başarısız yalnızca çalıştığı için. sorusu Google'da ilk sonucuydu ve testler sadece yapıcı örneğinin geçmek olmaz nerede vardı bir senaryo olmadığı için burada bu cevabı ekledi. Kenar durumunun ne olduğunu hatırlarsam, cevaba ekleyeceğim. –

+1

Teşekkür ederiz! Bu benim için daha iyi bir çözümdü. Ben kullanıcı ilk veritabanında oluşturulan rekor tarihe değil düzenlenmiş tarihe varsayılan gerekiyordu. Bunun yerine 'DateType :: class' ayarlamak ve' Symfony \ Component \ Form \ Uzatma \ Çekirdek \ Tür \ DateType' kullanımı deyimi eklemek zorunda ikinci parametre olarak date' 'arasında –

5

Bu çözüm, varlık nesnesini değiştirmeyi gerektirmez.

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

Bu çözüm, davranışı yalnızca bu forma uygular, bu davranışı öğenin kendisine göre eşleştirmez. Bir varlığı farklı davranışlarla değiştiren birkaç formunuz olabilir. Bazıları varsayılan bir tarih gerektiriyor, diğerleri yok.

İlgili konular