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.

Citricguy
fuente
¿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',
  );
Vadym Myrgorod
fuente
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.

MD3
fuente
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',
);
Citricguy
fuente
2

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

Tienes que usar algo como:

$mydate = date('Y-m-d', strtotime('31 May 2011'));
Countzero
fuente
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);

});
Nitesh Sethia
fuente
1

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

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

Prueba esto:

$now = date_now('UTC');
$now = date_format($now, "Y-m-d H:i:s");
rodpal
fuente
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';
Francisco luz
fuente
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 ;
   }
}
Aswini K
fuente
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();
giorgio79
fuente
-1

utilizaba el tiempo () y funcionaba bien ...

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

wacto
fuente