Programmgesteuerte Datumsfelder in Drupal 7 festlegen: Datum, Datum (ISO-Format) und Datum (Unix-Zeitstempel)


11

Wie kann ich mithilfe der Formular-API und hook_form_alter () die Werte für jeden Datumsfeldtyp von Drupal 7 mithilfe eines gültigen Unix-Zeitstempels manuell festlegen (erzwingen)?

Wenn das Formular endgültig gesendet wird, sind die field_date-Typen immer leere Arrays. Unten ist der kaputte Code, mit dem ich arbeite.

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

Ich sollte erwähnen, dass das Feld-Widget auf Text eingestellt ist und das Format "Ymd H: i: s" lautet.

Ich habe es auch versucht date('Y-m-d H:i:s', time())statt time().

Beispielausgabe von dpm ().

Beispielausgabe von dpm ()

Ich sollte auch beachten, dass ich als Problemumgehung das Feld festlegen kann, wenn ich es in hook_node_presave () ändere . Um dies zu tun, $node->field_date['und'][0]['value'] = date('Y-m-d H:i:s', $my_unix_timestamp);möchte ich immer noch verstehen, wie dies stattdessen mit hook_form_alter gemacht wird.


Inwiefern ist dieser Code kaputt?
Countzero

Datum ('Ym-d', strtotime ('31 May 2011 ')) und time () sind immer leer. Ich fange an zu glauben, dass ich das falsche Array für Daten verwende. $ form ['date_field'] ['und'] [0] ['value'] ist möglicherweise nicht korrekt? Zurück zu den Dokumenten ist es.
Citricguy

Wenn das Formular endgültig gesendet wird, sind die field_date-Typen immer leere Arrays.
Citricguy

Hast du versucht zu setzen $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']?
Countzero

Könnten Sie nicht versuchen, benutzerdefinierten Code zu entfernen und das Formular von der Benutzeroberfläche zu senden, um das nativ aus dem Feld gespeicherte Format zu überprüfen?
WestieUK

Antworten:


14

Hier ist ein Code, der die Zeitzone der Site für mich richtig behandelt:

 $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 Jahre später ist dies immer noch eine gute Antwort. Wäre es nicht sinnvoll, es zu verwenden 'timezone' => variable_get('date_default_timezone', 'UTC'),?
Marcvangend

6

Jeder Datumsfeldtyp erwartet einen anders formatierten Zeitstempel (basierend darauf, wie er in der Datenbank gespeichert ist):

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

Beachten Sie, dass Sie kein vollständiges Datum angeben müssen. Für Datum und Uhrzeit können Sie einfach Nullen auffüllen, z. B. "2011-05-00 00:00:00" (Datum / Uhrzeit), "2011-00-00T00: 00: 00" (Datum) usw. Für Datumsstempel können Sie einfach zB strtotime ("2011-05-25").

Wichtig: Beachten Sie auch, dass der von Ihnen angegebene genaue Wert zwar in der Datenbank gespeichert wird, die auf der Site angezeigte tatsächliche Zeit jedoch je nach Zeitzoneneinstellungen unterschiedlich sein kann. Wenn Sie ein neues Feld datetime / date / datestamp erstellen, können Sie zwischen fünf verschiedenen Methoden zur Behandlung von Zeitzonen wählen. Die Standardeinstellung ist "Zeitzone der Site":

Bei der Eingabe von Daten in das Feld wird davon ausgegangen, dass sich die eingegebenen Daten in der Zeitzone des Standorts befinden. Wenn die Daten in der Datenbank gespeichert werden, werden sie in UTC konvertiert. Wenn Sie jedoch ein Datumsfeld programmgesteuert wie im obigen Beispiel festlegen, findet keine Konvertierung statt. Berücksichtigen Sie daher die Zeitzoneneinstellungen des Felds. Mit anderen Worten, wenn Sie die "Zeitzone der Site" verwenden, stellen Sie sicher, dass die Zeit in UTC angegeben ist.

Auf diese Informationen wurde aus dem Abschnitt mit der Bezeichnung Datum (Datum / Uhrzeit, Datum, Datumsstempel) in fooninjas Blog verwiesen.

Dies ist auch eine großartige allgemeine Ressource für die programmatische Knotenerstellung in Drupal 7.


Sie benötigen Anführungszeichen um die
Wertschlüssel

Danke Meisterhäuptling! Aktualisiert, um Ihre Verbesserung widerzuspiegeln.
MD3

5

Das hat bei mir funktioniert.

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

2

Der time()Wert funktioniert auf dieser Ebene nicht.

Sie müssen etwas verwenden wie:

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

Dies funktioniert bei hook_node_presave, aber nicht bei hook_form_alter.
Citricguy

Haben Sie versucht, $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']wie oben erwähnt einzustellen ?
Countzero

Fand es Knoten vorgespeichert bei $ node-> field_date [LANGUAGE_NONE] [0]
Citricguy

Arbeiten Sie nicht mit hook_form_alter ... Hilfe?
Rajesh Vishwakarma

2

Für Date-Sachen könnten wir ein js schreiben, um das aktuelle Datum zu erhalten ...

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

Wenn Sie einen Feldtyp verwenden, Date (ISO format)verwenden Sie:

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

1

Versuche dies:

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

1

Für diejenigen, die sich mit $ form_state und dem Popup-Widget beschäftigen:

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

Um einen Wert auf ein Datumsfeld festzulegen, folgen Sie den nachstehenden Codes.

Hook_form_alter verwenden

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

Verwenden von hook_node_submit oder hook_node_presave (Speichern des Werts in der Datenbank)

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

Wenn Sie den Wert eines benutzerdefinierten Felds (definiert in hook_form_alter) in einem anderen speichern müssen, lesen Sie die folgenden Codes.

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

Die akzeptierte Antwort gab mir eine PDO-Ausnahme. Nur ein einfacher Aufruf von time () funktionierte für ein "Datenstempel" -Feld!

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

-1

benutzte Zeit () und funktionierte OK ....

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.