web-dev-qa-db-fra.com

Définir la valeur par défaut sur le champ Datetime sous forme symfony2

J'ai un formulaire contenant plusieurs champs. L'un d'eux est un champ Datetime. Comment définir une valeur par défaut pour ce champ?

J'ai essayé de définir une valeur sur l'entité associée, dans le contrôleur, dans le constructeur et __construct:

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

Ne fonctionne pas.

J'ai essayé de définir le $data variable dans le buildForm:

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

Ne fonctionne pas non plus. Des idées, la communauté Symfony2?

EDIT: Ajout d'une entité sur demande de faost.

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

Définissez-le dans le constructeur d'entité:

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

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

La réponse d'Elnur est correcte et est peut-être celle recommandée. Mais pour être complet, une autre façon de définir la valeur par défaut d'un widget de date dans un formulaire est de spécifier la clé data dans l'argument du tableau d'options avec une instance de DateTime.

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

Remarque: cela écrasera la date/heure définie précédemment à chaque modification.

29
Adam Elsodaney

Cette solution ne nécessite pas de modifier votre objet entité.

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

Cette solution applique le comportement à cette forme uniquement, elle ne couple pas ce comportement à l'entité elle-même. Vous pouvez avoir plusieurs formulaires qui modifient une entité avec différents comportements requis. Certains nécessitent une date par défaut, d'autres non.

8
Henry