Drupal 7'deki tarih alanlarını programlı olarak ayarlayın: Tarih, Tarih (ISO Biçimi) ve Tarih (Unix Zaman Damgası)


11

Kullanma Formu API ve hook_form_alter () elle geçerli bir Unix Zaman Damgası kullanarak Drupal 7'nin tarih alanı türlerinin her biri için (kuvvet) değerleri ayarlamak nasıl?

Form sonunda gönderildiğinde field_date türleri her zaman boş dizilerdir. Aşağıda çalıştığım kırık kod var.

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

Alanlar widget'ı metin olarak ayarlanmış ve biçimi 'Ymd H: i: s'

Ben de date('Y-m-d H:i:s', time())yerine denedim time().

Örnek dpm () çıktısı.

Örnek dpm () çıktısı

Ayrıca, bir çözüm olarak hook_node_presave () değiştirirseniz alanı ayarlayabileceğini unutmayın . Bunu yapmak için $node->field_date['und'][0]['value'] = date('Y-m-d H:i:s', $my_unix_timestamp);ben hala bunun yerine hook_form_alter kullanarak nasıl yapılacağını anlamak istiyorum ayarlayın .


Bu kod ne şekilde bozuldu?
Countzero

hem tarih ('Ym-d', strtotime ('31 Mayıs 2011 ')) ve time () her zaman boştur. Tarihler için yanlış dizi kullandığımı düşünmeye başladım. $ form ['date_field'] ['und'] [0] ['değer'] doğru olmayabilir mi? Dokümanlara geri dönelim.
Citricguy

Form sonunda gönderildiğinde field_date türleri her zaman boş dizilerdir.
Citricguy

Ayarlamaya çalıştın $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']mı?
Countzero

Alandan yerel olarak kaydedilen biçimi kontrol etmek için herhangi bir özel kodu kaldırmayı ve formu kullanıcı arayüzünden göndermeyi deneyemez misiniz?
WestieUK

Yanıtlar:


14

Site saat dilimi benim için doğru davranan bir kod:

 $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 yıl sonra bu hala iyi bir cevap. Kullanmak yine de mantıklı değil mi 'timezone' => variable_get('date_default_timezone', 'UTC'),?
marcvangend

6

Her tarih alanı türü farklı biçimlendirilmiş bir zaman damgası bekler (DataBase'de nasıl depolandığına bağlı olarak):

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

Tam bir tarih belirtmeniz gerekmediğini unutmayın; datetime ve tarih için sadece sıfırlarla yastıklayabilirsiniz, örneğin "2011-05-00 00:00:00" (datetime), "2011-00-00T00: 00: 00" (tarih), vb. örneğin strtotime ("2011-05-25").

Önemli: Belirttiğiniz tam değer veritabanında saklanacak olsa da, sitede görüntülenen gerçek zamanın saat dilimi ayarlarına bağlı olarak farklı olabileceğini unutmayın. Yeni bir tarih / tarih / tarih damgası alanı oluşturduğunuzda, beş farklı saat dilimi işleme yöntemi arasından seçim yapabilirsiniz. Varsayılan ayar "sitenin saat dilimi" dir:

Alana veri girerken, girilen verilerin sitenin saat diliminde olduğu varsayılır. Veri veritabanına kaydedildiğinde, UTC'ye dönüştürülür. Ancak, yukarıdaki örnekte olduğu gibi programlı olarak bir tarih alanı ayarlarsanız, dönüşüm gerçekleşmez, bu nedenle alanın saat dilimi ayarlarını dikkate aldığınızdan emin olun. Başka bir deyişle, "sitenin saat dilimi" kullanıyorsanız, saatin UTC'de olduğundan emin olun.

Bu bilgilere fooninja'nın blogunda Tarih alanı (tarih, tarih, tarih damgası ) etiketli bölümden başvurulmuştur .

Bu aynı zamanda Drupal 7'de programatik düğüm oluşturma için harika bir genel kaynaktır.


Değer anahtarları hakkında alıntılara ihtiyacınız var
masterchief

Teşekkürler masterchief! Gelişmenizi yansıtacak şekilde güncellendi.
MD3

5

Bu benim için çalıştı.

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

2

time()Değeri bu seviyede çalışmaz.

Şunun gibi bir şey kullanmalısınız:

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

Bu benim için hook_node_presave'de çalışır, ancak hook_form_alter'da çalışmaz.
Citricguy

$form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']Yukarıda belirtildiği gibi ayarlamaya çalıştınız mı?
Countzero

Düğümü $ node-> field_date konumunda [LANGUAGE_NONE] [0] olarak
buldum

Hook_form_alter ile çalışmıyor ... herhangi bir yardım?
Rajesh Vishwakarma

2

Tarih şeyler için geçerli tarihi almak için bir js yazabiliriz ...

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

Alan türünü kullanıyorsanız şunu Date (ISO format)kullanın:

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

1

Bunu dene:

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

1

$ Form_state ve popup widget'ıyla ilgilenenler için:

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

Tarih alanına bir değer ayarlamak için aşağıdaki kodları izleyin.

Hook_form_alter kullanma

$ form ["field_date"] ["und"] [0] ['# default_value'] ['değer'] = $ new_date;

Hook_node_submit veya hook_node_presave kullanma (Değeri veritabanına kaydetme)

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

Veya bir özel alanın (hook_form_alter içinde tanımlanmış) değerini diğerine kaydetmeniz gerekiyorsa, aşağıdaki kodlara bakın.

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

Kabul edilen cevap bana PDO İstisnası veriyordu. Bir "tarih damgası" alanı için sadece basit bir time () çağrısı çalıştı!

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

-1

time () kullanılır ve Tamam çalıştı ....

$ Fc_item_wrapper-> field_data_pedido-> seti (time ());

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.