it-swarm.com.de

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

Wie kann ich mit Form API und hook_form_alter () die Werte für jeden Datumsfeldtyp von Drupal 7) manuell festlegen (erzwingen)? Verwenden Sie einen gültigen Unix-Zeitstempel?

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 "Y-m-d H: i: s" lautet.

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

Beispiel dpm () Ausgabe.

Example dpm() output

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

11
Citricguy

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',
  );
14
Vadym Myrgorod

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, Uhrzeit und Datum können Sie einfach Nullen auffüllen, z. "2011-05-00 00:00:00" (Datum/Uhrzeit), "2011-00-00T00: 00: 00" (Datum) usw. Für den Datenstempel können Sie einfach z. 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 Datums-/Datums-/Datums-/Datumsstempelfeld 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 Datumsfeld (Datum/Uhrzeit, Datum, Datumsstempel) in fooninjas Blog verwiesen.

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

6
MD3

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',
);
5
Citricguy

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

});
2
Nitesh Sethia

Der Wert time() funktioniert auf dieser Ebene nicht.

Sie müssen etwas verwenden wie:

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

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
Francisco Luz

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 ;
   }
}
1
Aswini K

Versuche dies:

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

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

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

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();
0
giorgio79