Impostare programmaticamente i campi data in Drupal 7: Data, Data (formato ISO) e Data (Timestamp Unix)


11

Usando l' API Form e hook_form_alter () , come posso impostare (forzare) manualmente i valori per ciascuno dei tipi di campi data di Drupal 7 usando un Timestamp Unix valido?

Quando il modulo viene infine inviato, i tipi field_date sono sempre array vuoti. Di seguito è riportato il codice non funzionante da cui sto lavorando.

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

Dovrei menzionare che il widget dei campi è impostato su testo e il suo formato è 'Ymd H: i: s'

Ho anche provato date('Y-m-d H:i:s', time())invece di time().

Esempio di uscita dpm ().

Esempio di uscita dpm ()

Dovrei anche notare che come soluzione alternativa posso impostare il campo se lo modifico in hook_node_presave (). Per fare questo ho impostato $node->field_date['und'][0]['value'] = date('Y-m-d H:i:s', $my_unix_timestamp);vorrei ancora capire come fare usando hook_form_alter invece.


In che modo questo codice è rotto?
Countzero,

sia date ('Ym-d', strtotime ('31 maggio 2011 ')) che time () sono sempre vuoti. Sto iniziando a pensare che sto usando l'array sbagliato per le date. $ form ['date_field'] ['und'] [0] ['value'] potrebbe non essere corretto? Torna ai documenti che è.
Citricguy,

Quando il modulo viene infine inviato, i tipi field_date sono sempre array vuoti.
Citricguy,

Hai provato a impostare $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']?
Countzero,

Non potresti provare a rimuovere qualsiasi codice personalizzato e inviare il modulo dall'interfaccia utente per verificare il formato salvato nativamente dal campo?
WestieUK,

Risposte:


14

Ecco un codice che tratta il fuso orario del sito per me:

 $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 anni dopo questa è ancora una buona risposta. Non avrebbe senso usare 'timezone' => variable_get('date_default_timezone', 'UTC'),?
marcvangend,

6

Ogni tipo di campo data prevede un timestamp formattato in modo diverso (in base alla modalità di archiviazione nel DataBase):

// 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");

Si noti che non è necessario specificare una data completa; per datetime e date puoi semplicemente riempire con zeri, ad es. "2011-05-00 00:00:00" (datetime), "2011-00-00T00: 00: 00" (data), ecc. Per datestamp potresti semplicemente es. strtotime ("25/05/2011").

Importante: si noti inoltre che mentre il valore esatto specificato verrà archiviato nel database, l'ora effettiva visualizzata sul sito potrebbe essere diversa a seconda delle impostazioni del fuso orario. Quando si crea un nuovo campo datetime / date / datestamp, è possibile scegliere tra cinque diversi metodi di gestione del fuso orario. Quello predefinito è "fuso orario del sito":

Quando si inseriscono i dati nel campo, si presume che i dati inseriti si trovino nel fuso orario del sito. Quando i dati vengono salvati nel database, vengono convertiti in UTC. Tuttavia, se imposti un campo data a livello di codice come nell'esempio precedente, non viene eseguita alcuna conversione, quindi assicurati di tenere conto delle impostazioni del fuso orario del campo. O in altre parole, se si utilizza "fuso orario del sito", assicurarsi che l'ora sia in UTC.

Questa informazione è stata referenziata dalla sezione campo Data (datetime, data, datestamp) sul blog di fooninja.

Questa è anche una grande risorsa generale per la creazione di nodi programmatici in Drupal 7.


Hai bisogno di virgolette attorno alle chiavi dei valori
Masterchief

Grazie maestro! Aggiornato per riflettere il tuo miglioramento.
MD3,

5

Questo ha funzionato per me.

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

2

Il time()valore non funzionerà a questo livello.

Devi usare qualcosa come:

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

Questo funziona per me su hook_node_presave, ma non su hook_form_alter.
Citricguy,

Hai provato a impostare $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']come indicato sopra?
Countzero,

Trovato il nodo preimpostato su $ node-> field_date [LANGUAGE_NONE] [0]
Citricguy

Non funziona con hook_form_alter ... qualche aiuto?
Rajesh Vishwakarma,

2

Per roba Date potremmo scrivere un js per ottenere la data corrente ...

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

Se si utilizza il tipo di campo, Date (ISO format)utilizzare:

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

1

Prova questo:

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

1

Per chi ha a che fare con $ form_state e widget popup:

// 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

Per impostare un valore su un campo data, seguire i codici seguenti.

Utilizzando hook_form_alter

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

Uso di hook_node_submit o hook_node_presave (Salvataggio del valore nel database)

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

Oppure, se è necessario salvare il valore di un campo personalizzato (definito in hook_form_alter) in un altro, vedere i codici seguenti.

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 risposta accettata mi stava dando un'eccezione DOP. Solo una semplice chiamata time () ha funzionato per un campo "datestamp"!

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

-1

tempo usato () e ha funzionato bene ....

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.