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.

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

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

Der time()Wert funktioniert auf dieser Ebene nicht.

Sie müssen etwas verwenden wie:

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

});
Nitesh Sethia
quelle
1

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

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

Versuche dies:

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

benutzte Zeit () und funktionierte OK ....

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

Wacto
quelle