2012-01-03 6 views
39

У меня есть форма, содержащая несколько полей. Одним из них является поле Datetime. Как определить значение по умолчанию для этого поля?Установить значение по умолчанию в поле Datetime в форме symfony2

Я попытался установить значение на соответствующий объект, в контроллере, в конструкторе и __construct:

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

Не работает.

Пытались определить $data переменную в buildForm:

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

Не работает либо. Любые идеи, сообщество Symfony2?

EDIT: Добавление объекта по требованию.

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

Просьба показать определение свойства "myDate" в классе "MyEntity" и метод "buildForm" класса типа типа "AddMyEntity". –

+0

Вторая часть моего вопроса - это извлечение метода buildForm. И я добавлю часть сущности. –

+0

Ваш код в порядке, он должен работать. Но я замечаю, что вы используете тип отображения доктрины datetime для поля «myDate», поэтому лучше использовать тип поля типа datetime в классе «AddMyEntity» http://symfony.com/doc/current/reference/forms/types/datetime.html –

ответ

56

установить его в конструкторе объекта:

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

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

Как сказано в вопросе, если он попытался установить его так же, как и в __construct, как в функции MyEntity() без успеха. –

+0

Чтобы завершить ваше предложение, оно действительно работает на простых типах: текст, int и т. Д. Он не работает с DateTime. –

+0

Хм. Я инициализирую объекты DateTime в конструкторах, и он отлично работает. Возможно, что-то не так где-то в вашем приложении. –

-4

Вы можете установить атрибуты в обновлении CURRENT_TIMESTAMP и DEFUALT на текущий штамп времени будет автоматически обновлять текущую отметку времени без обновления через запрос

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

As сказал в вопросе выше, я пытаюсь установить значение по умолчанию в форме. Не в базе данных. Мне нужно указать значение по умолчанию для пользователя. –

27

Ответ Elnur является правильным и, возможно, является рекомендуемым. Но для полноты альтернативного способа установить значение по умолчанию для виджета даты в форме - указать ключ data в аргументе массива параметров с экземпляром DateTime.

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

Примечание: Это приведет к перезаписи ранее установленные даты и времени на каждом редактирования.

+6

. Этот подход работает только при добавлении новой записи, но с ошибкой при редактировании, поскольку он не помещает значение базы данных, а текущее время на форму –

+0

@MasindeMuliro Исправить. Я добавил этот ответ здесь, потому что вопрос был первым результатом в Google, и был сценарий, который у меня был, когда тесты не проходили, просто создавая экземпляр в конструкторе. Если я вспомню, что такое край, я добавлю его к ответу. –

+1

Спасибо! Это было лучшим решением для меня. Мне нужно было указать дату, когда пользователь отредактировал запись, а не дату, когда она была впервые создана в базе данных. –

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

Это решение применяет поведение только к этой форме, оно не связывает это поведение с самим объектом. У вас может быть несколько форм, которые изменяют объект с различным требуемым поведением. Некоторым требуется дата по умолчанию, другие - нет.

Смежные вопросы