2012-01-03 13 views
39

Mam formularz zawierający kilka pól. Jednym z nich jest pole Datetime. Jak zdefiniować wartość domyślną dla tego pola?Ustaw domyślną wartość w polu Datetime w postaci symfony2

Próbowałem ustawienie wartości od podmiotu powiązanego, w sterowniku, w konstruktorze i __construct:

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

nie działa.

Próbowano zdefiniować zmienną $data w buildForm:

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

nie działa albo. Jakieś pomysły, społeczność Symfony2?

EDYCJA: Dodanie podmiotu na żądanie faksu.

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

Proszę podać definicję właściwości "myDate" w klasie "MyEntity" i metodę "buildForm" klasy typu "AddMyEntity". –

+0

Druga część mojego pytania to fragment metody buildForm. I dodam część encji. –

+0

Twój kod jest OK, powinien działać. Ale zwracam uwagę, że używasz typu mapowania doktryny datetime dla pola "myDate", więc lepiej użyj typu pola datetime w klasie "AddMyEntity" http://symfony.com/doc/current/reference/forms/types/datetime.html –

Odpowiedz

56

ustawić go w konstruktorze jednostki:

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

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

Jak powiedziano w pytaniu, jeśli próbowano ustawić go tak samo jak w __construct jak w funkcji MyEntity() bez powodzenia. –

+0

Aby ukończyć swoją sugestię, działa ona na prostych typach: text, ints i tak dalej. To nie działa na DateTime. –

+0

Hmm. Inicjuję obiekty 'DateTime' w konstruktorze i działa świetnie. Prawdopodobnie coś jest nie tak gdzie indziej w Twojej aplikacji. –

-4

można ustawić atrybuty na uaktualnienia CURRENT_TIMESTAMP i defualt do aktualnej stemplem czasowym zaktualizuje aktualny znacznik czasu automatycznie bez aktualizowania poprzez zapytania

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

Jako powiedział w powyższym pytaniu, próbuję ustawić wartość domyślną w formularzu. Nie w bazie danych. Muszę zasugerować domyślną wartość dla użytkownika. –

27

Odpowiedź Elnur jest poprawna i jest prawdopodobnie zalecana. Jednak dla kompletności alternatywnym sposobem ustawienia wartości domyślnej widżetu daty w formularzu jest określenie klucza data w argumencie opcji tablicy z wystąpieniem DateTime.

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

Uwaga: Spowoduje to zastąpienie wcześniej ustawione datetime na każdej edycji.

+6

To podejście działa tylko podczas dodawania nowego wpisu, ale kończy się niepowodzeniem podczas edycji, ponieważ nie wstawia wartości bazy danych, ale aktualny czas na formularzu –

+0

@MasindeMuliro Correct. Dodałem tę odpowiedź tutaj, ponieważ pytanie było pierwszym wynikiem w Google i był taki scenariusz, w którym testy nie przeszłyby po prostu utworzeniu instancji w konstruktorze. Jeśli przypominam sobie, co było na krawędzi, dodam to do odpowiedzi. –

+1

Dziękujemy! To było dla mnie lepsze rozwiązanie. Musiałem ustawić domyślną datę, w której użytkownik edytował rekord, a nie datę utworzenia w bazie danych. –

5

To rozwiązanie nie wymaga modyfikacji obiektu obiektu.

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

To rozwiązanie stosuje zachowanie tylko do tego formularza, nie łączy tego zachowania z samą jednostką. Możesz mieć kilka formularzy, które modyfikują jednostkę z różnymi wymaganymi zachowaniami. Niektóre wymagają domyślnej daty, inne nie.

Powiązane problemy