Establecer campos de fecha mediante programación en Drupal 7: Fecha, Fecha (Formato ISO) y Fecha (Marca de tiempo Unix)


11

Usando la API de formulario y hook_form_alter () , ¿cómo puedo configurar (forzar) manualmente los valores para cada uno de los tipos de campo de fecha de Drupal 7 usando una marca de tiempo válida de Unix?

Cuando el formulario finalmente se envía, los tipos field_date siempre son matrices vacías. A continuación se muestra el código roto desde el que estoy trabajando.

hook_form_alter(&$form, &$form_state, $form_id) {

    // http://drupal.org/node/1455576 - Date
    $form['field_date'][LANGUAGE_NONE][0]['value'] = time();

    // http://drupal.org/node/1455576 - Date (ISO Format)
    $form['field_date_iso_format'][LANGUAGE_NONE][0]['value'] = time();

    // http://drupal.org/node/1455576 - Date (Unix Timestamp)
    $form['field_date_unix_timestamp'][LANGUAGE_NONE][0]['value'] =time();
}

Debo mencionar que el widget de campos está configurado en texto y su formato es 'Ymd H: i: s'

También lo he intentado en date('Y-m-d H:i:s', time())lugar de time().

Ejemplo de salida dpm ().

Ejemplo de salida dpm ()

También debo tener en cuenta que, como solución alternativa, puedo establecer el campo si lo modifico en hook_node_presave (). Para hacer esto, configuré $node->field_date['und'][0]['value'] = date('Y-m-d H:i:s', $my_unix_timestamp);. Todavía me gustaría entender cómo hacerlo usando hook_form_alter.


¿De qué manera se rompe este código?
Countzero

tanto la fecha ('Ym-d', strtotime ('31 de mayo de 2011 ')) como la hora () siempre están vacías. Estoy empezando a pensar que estoy usando la matriz incorrecta para las fechas. $ form ['date_field'] ['und'] [0] ['value'] puede no ser correcto? De vuelta a los documentos que es.
Citricguy

Cuando el formulario finalmente se envía, los tipos field_date siempre son matrices vacías.
Citricguy

¿Intentaste configurar $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']?
Countzero

¿No podría intentar eliminar cualquier código personalizado y enviar el formulario desde la interfaz de usuario para verificar el formato guardado de forma nativa desde el campo?
WestieUK

Respuestas:


14

Aquí hay un código que trata la zona horaria del sitio adecuada para mí:

 $node->field_date[LANGUAGE_NONE][0] = array(
    'value' => format_date(strtotime('now'), 'custom', 'Y-m-d H:i:s', 'UTC'),
    'timezone' => 'UTC',  
    'timezone_db' => 'UTC',
  );

1
5 años después, esta sigue siendo una buena respuesta. ¿No tendría sentido usar 'timezone' => variable_get('date_default_timezone', 'UTC'),?
marcvangend

6

Cada tipo de campo de fecha espera una marca de tiempo con un formato diferente (en función de cómo se almacena en la base de datos):

// For datetime
$node->field_datetest[$node->language][0]['value'] = "2011-05-25 10:35:58";

// For date
$node->field_datetest[$node->language][0]['value'] = "2011-05-25T10:35:58";

// For datestamp
$node->field_datetest[$node->language][0]['value'] = strtotime("2011-05-25 10:35:58");

Tenga en cuenta que no necesita especificar una fecha completa; para fecha y hora, puede simplemente rellenar con ceros, por ejemplo, "2011-05-00 00:00:00" (fecha y hora), "2011-00-00T00: 00: 00" (fecha), etc. Para el sello de fecha puede simplemente hacer, por ejemplo, strtotime ("2011-05-25").

Importante: Tenga en cuenta también que, si bien el valor exacto que especifique se almacenará en la base de datos, el tiempo real que se muestra en el sitio puede ser diferente según la configuración de la zona horaria. Cuando crea un nuevo campo datetime / date / datestamp, puede elegir entre cinco métodos diferentes de manejo de zona horaria. El predeterminado es "zona horaria del sitio":

Al ingresar datos en el campo, se supone que los datos ingresados ​​se encuentran en la zona horaria del sitio. Cuando los datos se guardan en la base de datos, se convierten a UTC. Sin embargo, si establece un campo de fecha mediante programación como en el ejemplo anterior, entonces no se realiza ninguna conversión, así que asegúrese de tener en cuenta la configuración de la zona horaria del campo. O, en otras palabras, si usa la "zona horaria del sitio", asegúrese de que la hora esté en UTC.

Esta información fue referenciada desde la sección etiquetada Campo de fecha (fecha y hora, fecha, sello de fecha) en el blog de fooninja.

Este también es un gran recurso general para la creación programática de nodos en Drupal 7.


Necesita cotizaciones alrededor de las claves de valor
masterchief

Gracias masterchief! Actualizado para reflejar su mejora.
MD3

5

Esto funcionó para mí.

$node->field_date[LANGUAGE_NONE][0] = array(
      'value' => date('Y-m-d H:i:s', strtotime('now')),
      'timezone' => 'UTC',
      'timezone_db' => 'UTC',
);

2

El time()valor no funcionará en este nivel.

Tienes que usar algo como:

$mydate = date('Y-m-d', strtotime('31 May 2011'));

Esto funciona para mí en hook_node_presave, pero no en hook_form_alter.
Citricguy

¿Intentaste configurar $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']como se mencionó anteriormente?
Countzero

Lo encontré guardado de nodo en $ node-> field_date [LANGUAGE_NONE] [0]
Citricguy

No funciona con hook_form_alter ... ¿alguna ayuda?
Rajesh Vishwakarma

2

Para las cosas de fecha, podríamos escribir un js para obtener la fecha actual ...

jQuery(document).ready(function() {

    var fullDate = new Date()
    var HR_fullDate = fullDate.toDateString().toString().substring(4,15);
    jQuery('strong.date').contents().replaceWith(HR_fullDate);

});

1

Si usa el tipo de campo Date (ISO format), use:

$node->field_datetest[$node->language][0][value] = "2011-05-25T10:35";

1

Prueba esto:

$now = date_now('UTC');
$now = date_format($now, "Y-m-d H:i:s");

1

Para aquellos que tratan con $ form_state y el widget emergente:

// The date format in this sample is dd/mm/yyyy
$form_state['values']['field_my_date_field']['und'][0]['value']['date'] = '14/05/2014';

1

Para establecer un valor en un campo de fecha, siga los códigos a continuación.

Usando hook_form_alter

$ form ["field_date"] ["und"] [0] ['# default_value'] ['value'] = $ new_date;

Uso de hook_node_submit o hook_node_presave (Guardar el valor en la base de datos)

 function MY_MODULE_node_presave($node) 
  {
      $node->field_date['und'][0]['value'] =  '2014-09-23 00:00:00';
  }

O si necesita guardar el valor de un campo personalizado (definido en hook_form_alter) en otro, vea los códigos a continuación.

function MY_MODULE_node_submit($node, $form, &$form_state) {
  if($node->type == 'my_node_type') {
    $test_date =  $form['test_date ']['#value'];
    //Ensure that $test_date format is '2014-09-23 00:00:00'
    $node->field_date['und'][0]['value'] =  $test_date ;
   }
}

0

La respuesta aceptada me estaba dando una excepción PDO. ¡Solo una simple llamada time () funcionó para un campo "datestamp"!

        $entity->field_upload_time["und"][0]["value"] = time();

-1

utilizaba el tiempo () y funcionaba bien ...

$ fc_item_wrapper-> field_data_pedido-> set (time ());

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.