Secara terprogram mengatur bidang tanggal dalam Drupal 7: Tanggal, Tanggal (Format ISO) dan Tanggal (Unix Timestamp)

11

Menggunakan Formulir API dan hook_form_alter () , bagaimana saya bisa secara manual mengatur (memaksa) nilai untuk setiap jenis bidang tanggal Drupal 7 menggunakan Timestamp Unix yang valid?

Ketika formulir akhirnya mengirimkan tipe field_date selalu kosong array. Di bawah ini adalah kode rusak tempat saya bekerja.

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

Saya harus menyebutkan widget bidang diatur ke teks dan formatnya adalah 'Ymd H: i: s'

Saya juga mencoba date('Y-m-d H:i:s', time())bukan time().

Contoh output dpm ().

Contoh output dpm ()

Saya juga harus mencatat bahwa sebagai solusi saya dapat mengatur bidang jika saya memodifikasinya di hook_node_presave (). Untuk melakukan ini saya mengatur $node->field_date['und'][0]['value'] = date('Y-m-d H:i:s', $my_unix_timestamp);saya masih ingin memahami bagaimana melakukan ini menggunakan hook_form_alter sebagai gantinya.

Citricguy
sumber
Dengan cara apa kode ini rusak?
Countzero
tanggal ('Ym-d', strtotime ('31 Mei 2011 ')) dan waktu () selalu kosong. Saya mulai berpikir saya menggunakan array yang salah untuk kencan. $ form ['date_field'] ['und'] [0] ['value'] mungkin tidak benar? Kembali ke dokumen.
Citricguy
Ketika formulir akhirnya mengirimkan tipe field_date selalu kosong array.
Citricguy
Apakah Anda mencoba mengatur $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']?
Countzero
Tidak bisakah Anda mencoba menghapus kode khusus apa pun dan mengirimkan formulir dari ui untuk memeriksa format yang disimpan secara asli dari bidang?
WestieUK

Jawaban:

14

Berikut adalah kode yang memperlakukan zona waktu situs tepat untuk saya:

 $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
sumber
1
5 tahun kemudian ini masih merupakan jawaban yang bagus. Bukankah masuk akal untuk digunakan 'timezone' => variable_get('date_default_timezone', 'UTC'),?
marcvangend
6

Setiap tipe bidang tanggal mengharapkan cap waktu yang diformat berbeda (berdasarkan cara penyimpanannya di 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");

Perhatikan bahwa Anda tidak perlu menentukan tanggal yang lengkap; untuk datetime dan tanggal, Anda dapat menambahkan nol, mis. "2011-05-00 00:00:00" (datetime), "2011-00-00T00: 00: 00" (date), dll. Untuk datestamp, Anda hanya bisa lakukan misalnya strtotime ("2011-05-25").

Penting: Juga perhatikan bahwa meskipun nilai persis yang Anda tentukan akan disimpan dalam database, waktu aktual yang ditampilkan di situs mungkin berbeda tergantung pada pengaturan zona waktu. Saat Anda membuat bidang datetime / tanggal / datestamp baru, Anda bisa memilih antara lima metode penanganan zona waktu yang berbeda. Yang standar adalah "zona waktu situs":

Saat memasukkan data ke dalam bidang, data yang dimasukkan diasumsikan berada di zona waktu situs. Ketika data disimpan ke database, itu dikonversi ke UTC. Namun, jika Anda menyetel bidang tanggal secara terprogram seperti pada contoh di atas maka tidak ada konversi yang terjadi, jadi pastikan Anda memperhitungkan pengaturan zona waktu bidang tersebut. Atau dengan kata lain, jika Anda menggunakan "zona waktu situs", pastikan waktunya di UTC.

Informasi ini dirujuk dari bagian berlabel Tanggal bidang (datetime, date, datestamp) di blog fooninja.

Ini juga merupakan sumber daya umum yang bagus untuk pembuatan simpul program di Drupal 7.

MD3
sumber
Anda perlu mengutip di sekitar kunci nilai
masterchief
Terima kasih tuan! Diperbarui untuk mencerminkan peningkatan Anda.
MD3
5

Ini berhasil untuk saya.

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

The time()nilai tidak akan bekerja pada tingkat ini.

Anda harus menggunakan sesuatu seperti:

$mydate = date('Y-m-d', strtotime('31 May 2011'));
Countzero
sumber
Ini berfungsi untuk saya di hook_node_presave, tetapi tidak di hook_form_alter.
Citricguy
Apakah Anda mencoba mengatur $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']seperti yang disebutkan di atas?
Countzero
Menemukannya simpul presave di $ node-> field_date [LANGUAGE_NONE] [0]
Citricguy
Tidak bekerja dengan hook_form_alter ... ada bantuan?
Rajesh Vishwakarma
2

Untuk hal-hal Date kita bisa menulis js untuk mendapatkan tanggal saat ini ...

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
sumber
1

Jika Anda menggunakan jenis bidang Date (ISO format)maka gunakan:

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

Coba ini:

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

Bagi mereka yang berurusan dengan $ form_state dan 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';
Francisco Luz
sumber
1

Untuk menetapkan nilai ke bidang tanggal, ikuti kode di bawah ini.

Menggunakan hook_form_alter

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

Menggunakan hook_node_submit atau hook_node_presave (Menyimpan nilai ke database)

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

Atau jika Anda perlu menyimpan nilai dari satu bidang khusus (didefinisikan dalam hook_form_alter) ke yang lain, lihat kode di bawah ini.

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
sumber
0

Jawaban yang diterima memberi saya Pengecualian PDO. Hanya panggilan waktu () sederhana yang berfungsi untuk bidang "datestamp"!

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

menggunakan waktu () dan bekerja OK ....

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

wacto
sumber