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.