Set default value on Datetime field in symfony2 form

PhpSymfonySymfony 2.1

Php Problem Overview


I have a form containing several fields. One of them is a Datetime field. How to define a default value for that field?

I've tried setting a value on the related entity, in controller, in constructor and __construct :

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

Not working.

Tried to define the $data variable in the buildForm :

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

Not working either. Any ideas, Symfony2 community?

EDIT : Adding entity on demand of faost.

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

Php Solutions


Solution 1 - Php

Set it in the entity constructor:

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

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

Solution 2 - Php

Elnur's answer is correct and is perhaps the recommended one. But for completeness, an alternative way to set the default value for a date widget in a form is to specify the data key in the options array argument with an instance of DateTime.

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

Note: This will overwrite the previously set datetime on every edit.

Solution 3 - Php

This solution doesn't require modifying your entity object.

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

This solution applies the behaviour to just this form, it does not couple this behaviour to the entity itself. You might have several forms that modify an entity with different required behaviours. Some require a default date, others don't.

Solution 4 - Php

You can set the attributes to on update CURRENT_TIMESTAMP and defualt to current time stamp will update the current time stamp automatically without updating through query

`feildname` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questioni.am.michielView Question on Stackoverflow
Solution 1 - PhpElnur AbdurrakhimovView Answer on Stackoverflow
Solution 2 - PhpAdam ElsodaneyView Answer on Stackoverflow
Solution 3 - PhpHenryView Answer on Stackoverflow
Solution 4 - PhpBoopathiView Answer on Stackoverflow