ตั้งค่าฟิลด์วันที่โดยทางโปรแกรมใน Drupal 7: วันที่, วันที่ (รูปแบบ ISO) และวันที่ (Unix Timestamp)


11

การใช้Form APIและhook_form_alter ()ฉันจะตั้งค่า (บังคับ) ค่าด้วยตนเองสำหรับแต่ละประเภทฟิลด์วันที่ของ Drupal 7 โดยใช้ Unix Timestamp ที่ถูกต้องได้อย่างไร

เมื่อฟอร์มถูกส่งรูปแบบ field_date เป็นอาร์เรย์ว่างเสมอ ด้านล่างเป็นรหัสที่ใช้งานไม่ได้

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

ฉันควรพูดถึงวิดเจ็ตฟิลด์ตั้งค่าเป็นข้อความและรูปแบบของมันคือ 'Ymd H: i: s'

ฉันได้พยายามยังแทนdate('Y-m-d H:i:s', time())time()

ตัวอย่างเอาต์พุตdpm ()

ตัวอย่างเอาต์พุต dpm ()

ฉันควรทราบว่าเป็นวิธีแก้ปัญหาฉันสามารถตั้งค่าเขตข้อมูลหากฉันแก้ไขในhook_node_presave () เมื่อต้องการทำสิ่งนี้ฉันตั้งค่า$node->field_date['und'][0]['value'] = date('Y-m-d H:i:s', $my_unix_timestamp);ฉันยังคงต้องการที่จะเข้าใจวิธีการทำเช่นนี้โดยใช้ hook_form_alter แทน


รหัสนี้ใช้งานไม่ได้ในทางใด
Countzero

ทั้งวันที่ ('Ym-d', strtotime ('31 พฤษภาคม 2011 ')) และเวลา () ว่างเปล่าเสมอ ฉันเริ่มคิดว่าฉันใช้อาร์เรย์ผิดสำหรับวันที่ $ form ['date_field'] ['und'] [0] ['value'] อาจไม่ถูกต้อง? กลับไปที่เอกสารมันคือ
Citricguy

เมื่อฟอร์มถูกส่งรูปแบบ field_date เป็นอาร์เรย์ว่างเสมอ
Citricguy

คุณลองตั้งค่าแล้ว$form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']หรือยัง
Countzero

คุณไม่สามารถลองลบรหัสที่กำหนดเองและส่งแบบฟอร์มจาก UI เพื่อตรวจสอบรูปแบบที่บันทึกไว้จากฟิลด์ได้หรือไม่
WestieUK

คำตอบ:


14

นี่คือรหัสที่ใช้กับเขตเวลาของไซต์สำหรับฉัน:

 $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 ปีต่อมานี่ยังคงเป็นคำตอบที่ดี มันจะไม่สมเหตุสมผล'timezone' => variable_get('date_default_timezone', 'UTC'),ใช่ไหม
marcvangend

6

แต่ละประเภทฟิลด์วันที่คาดว่าจะมีการประทับเวลาที่จัดรูปแบบแตกต่างกัน (ขึ้นอยู่กับวิธีการจัดเก็บในฐานข้อมูล):

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

โปรดทราบว่าคุณไม่จำเป็นต้องระบุวันที่สมบูรณ์ สำหรับวันที่และเวลาและวันที่คุณสามารถใช้ศูนย์ด้วยเช่น "2011-05-00 00:00:00" (วันที่และเวลา), "2011-00-00T00: 00: 00" (วันที่) และอื่น ๆ สำหรับวันที่คุณสามารถ ทำเช่น strtotime ("2011-05-25")

สำคัญ:โปรดทราบว่าในขณะที่ค่าที่แน่นอนที่คุณระบุจะถูกเก็บไว้ในฐานข้อมูลเวลาจริงที่แสดงบนไซต์อาจแตกต่างกันไปขึ้นอยู่กับการตั้งค่าเขตเวลา เมื่อคุณสร้างเขตข้อมูลวันที่ / เวลา / วันที่ใหม่คุณจะได้เลือกวิธีการจัดการเขตเวลาที่แตกต่างกันห้าวิธี ค่าเริ่มต้นคือ "เขตเวลาของไซต์":

เมื่อป้อนข้อมูลลงในฟิลด์ข้อมูลที่ป้อนจะถือว่าอยู่ในเขตเวลาของไซต์ เมื่อข้อมูลถูกบันทึกลงในฐานข้อมูลจะถูกแปลงเป็น UTC อย่างไรก็ตามหากคุณตั้งค่าฟิลด์วันที่โดยทางโปรแกรมเหมือนกับในตัวอย่างด้านบนจะไม่มีการแปลงเกิดขึ้นดังนั้นตรวจสอบให้แน่ใจว่าคุณตั้งค่าเขตเวลาของเขตข้อมูล หรือกล่าวอีกนัยหนึ่งถ้าคุณใช้ "เขตเวลาของไซต์" ตรวจสอบให้แน่ใจว่าเวลานั้นอยู่ใน UTC

ข้อมูลนี้ถูกอ้างอิงจากส่วนที่มีข้อความฟิลด์วันที่ (วันที่และเวลา, วันที่, วันที่)ในบล็อกของ fooninja

นี่เป็นทรัพยากรทั่วไปที่ยอดเยี่ยมสำหรับการสร้างโหนดแบบเป็นโปรแกรมใน Drupal 7


คุณต้องใส่เครื่องหมายคำพูดรอบคีย์ค่า
masterchief

ขอบคุณ masterchief! อัปเดตเพื่อสะท้อนการปรับปรุงของคุณ
MD3

5

สิ่งนี้ใช้ได้สำหรับฉัน

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

2

time()ค่าจะไม่ทำงานในระดับนี้

คุณต้องใช้สิ่งที่ชอบ:

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

สิ่งนี้ใช้ได้สำหรับฉันที่ hook_node_presave แต่ไม่ใช่ใน hook_form_alter
Citricguy

คุณพยายามตั้งค่า$form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']ตามที่กล่าวไว้ข้างต้นหรือไม่?
Countzero

พบว่าโหนดตั้งค่าไว้ที่ $ node-> field_date [LANGUAGE_NONE] [0]
Citricguy

ไม่ทำงานกับ hook_form_alter ... ความช่วยเหลือใด ๆ
Rajesh Vishwakarma

2

สำหรับสิ่งที่เราสามารถเขียน js เพื่อรับวันที่ปัจจุบัน ...

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

หากคุณใช้ประเภทฟิลด์ให้Date (ISO format)ใช้:

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


1

สำหรับผู้ที่เกี่ยวข้องกับวิดเจ็ต $ form_state และป๊อปอัป:

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

หากต้องการตั้งค่าเป็นฟิลด์วันที่ให้ทำตามรหัสด้านล่าง

ใช้ hook_form_alter

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

การใช้ hook_node_submit หรือ hook_node_presave (บันทึกค่าลงในฐานข้อมูล)

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

หรือหากคุณต้องการบันทึกค่าของฟิลด์ที่กำหนดเองหนึ่งฟิลด์ (กำหนดใน hook_form_alter) ไปยังฟิลด์อื่นให้ดูรหัสด้านล่าง

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

คำตอบที่ยอมรับคือให้ข้อยกเว้น PDO ให้ฉัน เฉพาะการโทรแบบเวลา () แบบธรรมดาเท่านั้นที่ทำงานสำหรับฟิลด์ "datestamp"

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.