2012-01-03 13 views
39

Tengo un formulario que contiene varios campos. Uno de ellos es un campo de fecha y hora. ¿Cómo definir un valor predeterminado para ese campo?Establecer el valor predeterminado en el campo Fecha y hora en el formulario symfony2

He tratado de establecer un valor a la entidad relacionada, en el controlador, en el constructor y __construct:

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

no trabajar.

tratado de definir la variable $data en el buildForm:

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

No funciona bien. ¿Alguna idea, comunidad de Symfony2?

EDITAR: Agregar entidad a demanda de faost.

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

Por favor, muestre la definición de la propiedad "myDate" en la clase "MyEntity" y el método "buildForm" de la clase de tipo de formulario "AddMyEntity". –

+0

La segunda parte de mi pregunta es un extracto del método buildForm. Y agregaré la parte de la entidad. –

+0

Su código está bien, debería funcionar. Pero me doy cuenta de que utiliza el tipo de asignación de correspondencia de fecha y hora para el campo "myDate", así que mejor use el tipo de campo datetime en la clase "AddMyEntity" http://symfony.com/doc/current/reference/forms/types/datetime.html –

Respuesta

56

Conjunto en el constructor entidad:

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

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

Como dije en la pregunta, si intenté configurarlo tan bien como en __construct como en la función MyEntity() sin éxito. –

+0

Solo para completar su sugerencia, en realidad funciona en tipos simples: texto, ints, etc. No funciona en DateTime. –

+0

Hmm. Inicializo los objetos 'DateTime' en los constructores y funciona muy bien. Probablemente algo está mal en otro lugar en su aplicación. –

-4

Puede establecer los atributos a en la actualización CURRENT_TIMESTAMP y defualt al sello de tiempo actual, se actualizará la indicación de la hora actual de forma automática sin actualizar a través de consultas

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

As dijo en la pregunta anterior, estoy tratando de establecer un valor predeterminado en un formulario. No en la base de datos. Necesito sugerir un valor predeterminado para el usuario no. –

27

La respuesta de Elnur es correcta y tal vez sea la recomendada. Pero, para completar, una forma alternativa de establecer el valor predeterminado para un widget de fecha en un formulario es especificar la clave data en el argumento de matriz de opciones con una instancia de DateTime.

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

Nota: Esto sobrescribirá la fecha y hora establecida previamente en cada edición.

+6

Este enfoque funciona solo cuando se agrega una nueva entrada pero falla al editar porque no pone el valor de la base de datos sino la hora actual en el formulario –

+0

@MasindeMuliro Correcto. Agregué esta respuesta aquí porque la pregunta era el primer resultado en Google y había un escenario donde las pruebas no pasaban simplemente instanciando en el constructor. Si recuerdo cuál era el caso límite, lo agregaré a la respuesta. –

+1

¡Gracias! Esta fue una mejor solución para mí. Necesitaba establecer de forma predeterminada la fecha en que el usuario editó el registro, no la fecha en que se creó por primera vez en la base de datos. –

5

Esta solución no requiere la modificación de su objeto entidad.

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

Esta solución aplica el comportamiento solo a esta forma, no asocia este comportamiento con la propia entidad. Puede tener varios formularios que modifiquen una entidad con diferentes comportamientos requeridos. Algunos requieren una fecha predeterminada, otros no.

Cuestiones relacionadas