Các trường ngày được đặt theo chương trình trong Drupal 7: Ngày, Ngày (Định dạng ISO) và Ngày (Dấu thời gian Unix)


11

Sử dụng API biểu mẫuhook_form_alter () , làm cách nào tôi có thể tự đặt (buộc) các giá trị cho từng loại trường ngày của Drupal 7 bằng cách sử dụng Dấu thời gian Unix hợp lệ?

Khi biểu mẫu cuối cùng được gửi, các kiểu field_date luôn là các mảng trống. Dưới đây là mã bị hỏng tôi đang làm việc.

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

Tôi nên đề cập đến tiện ích trường được đặt thành văn bản và định dạng của nó là 'Ymd H: i: s'

Tôi cũng đã thử date('Y-m-d H:i:s', time())thay thế time().

Ví dụ đầu ra dpm ().

Ví dụ đầu ra dpm ()

Tôi cũng cần lưu ý rằng như một cách giải quyết, tôi có thể đặt trường nếu tôi sửa đổi nó trong hook_node_presave (). Để làm điều này, tôi đặt $node->field_date['und'][0]['value'] = date('Y-m-d H:i:s', $my_unix_timestamp);tôi vẫn muốn hiểu cách thực hiện việc này bằng hook_form_alter thay thế.


Mã này bị hỏng theo cách nào?
Countzero

cả ngày ('Ym-d', strtotime ('31 tháng 5 năm 2011 ')) và thời gian () luôn trống. Tôi bắt đầu nghĩ rằng tôi đang sử dụng sai mảng cho ngày. $ form ['date_field'] ['und'] [0] ['value'] có thể không đúng? Quay lại với các tài liệu đó là.
Citricguy

Khi biểu mẫu cuối cùng được gửi, các kiểu field_date luôn là các mảng trống.
Citricguy

Bạn đã thử thiết lập $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']?
Countzero

Bạn có thể không thử xóa bất kỳ mã tùy chỉnh nào và gửi biểu mẫu từ ui để kiểm tra định dạng được lưu tự nhiên từ trường không?
WestieUK

Câu trả lời:


14

Đây là một mã xử lý múi giờ trang web phù hợp với tôi:

 $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 năm sau đây vẫn là một câu trả lời tốt. Nó sẽ không có ý nghĩa mặc dù sử dụng 'timezone' => variable_get('date_default_timezone', 'UTC'),?
marcvangend

6

Mỗi loại trường ngày đang mong đợi một dấu thời gian được định dạng khác nhau (dựa trên cách nó được lưu trữ trong 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");

Lưu ý rằng bạn không cần chỉ định một ngày hoàn chỉnh; đối với datetime và ngày, bạn chỉ có thể đệm với số không, ví dụ: "2011-05-00 00:00:00" (datetime), "2011-00-00T00: 00: 00" (ngày), v.v. Đối với dấu thời gian bạn chỉ có thể làm ví dụ: strtotime ("2011-05-25").

Quan trọng: Cũng lưu ý rằng mặc dù giá trị chính xác bạn chỉ định sẽ được lưu trữ trong cơ sở dữ liệu, thời gian thực tế được hiển thị trên trang web có thể khác nhau tùy thuộc vào cài đặt múi giờ. Khi bạn tạo trường datetime / date / datestamp mới, bạn có thể chọn giữa năm phương thức xử lý múi giờ khác nhau. Cái mặc định là "múi giờ của trang":

Khi nhập dữ liệu vào trường, dữ liệu được nhập được giả sử nằm trong múi giờ của trang web. Khi dữ liệu được lưu vào cơ sở dữ liệu, nó được chuyển đổi thành UTC. Tuy nhiên, nếu bạn đặt trường ngày theo chương trình như trong ví dụ trên thì sẽ không có chuyển đổi nào xảy ra, vì vậy hãy đảm bảo bạn tính đến các cài đặt múi giờ của trường. Hay nói cách khác, nếu bạn sử dụng "múi giờ của trang web", hãy đảm bảo rằng thời gian là trong UTC.

Thông tin này được tham chiếu từ phần có nhãn Trường ngày (datetime, date, datestamp) trên blog của fooninja.

Đây cũng là một tài nguyên chung tuyệt vời để tạo nút lập trình trong Drupal 7.


Bạn cần báo giá xung quanh các khóa giá trị
masterchief

Cảm ơn chủ mưu! Cập nhật để phản ánh sự cải thiện của bạn.
MD3

5

Điều này làm việc cho tôi.

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

2

Các time()giá trị sẽ không làm việc ở cấp độ này.

Bạn phải sử dụng một cái gì đó như:

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

Điều này hoạt động với tôi tại hook_node_presave, nhưng không phải trong hook_form_alter.
Citricguy

Bạn đã thử thiết lập $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']như đã đề cập ở trên?
Countzero

Đã tìm thấy nút đặt trước tại $ node-> field_date [LANGUAGE_NONE] [0]
Citricguy

Không hoạt động với hook_form_alter ... có giúp được gì không?
Rajesh Vishwakarma

2

Đối với công cụ ngày, chúng tôi có thể viết một js để có được ngày hiện tại ...

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

Nếu bạn đang sử dụng loại trường Date (ISO format)thì hãy sử dụng:

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

1

Thử đi:

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

1

Đối với những người giao dịch với $ form_state và tiện ích bật lên:

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

Để đặt giá trị cho trường ngày, hãy làm theo các mã dưới đây.

Sử dụng hook_form_alter

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

Sử dụng hook_node_submit hoặc hook_node_presave (Lưu giá trị vào cơ sở dữ liệu)

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

Hoặc nếu bạn cần lưu giá trị của một trường tùy chỉnh (được xác định trong hook_form_alter) sang một trường khác, hãy xem các mã bên dưới.

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

Câu trả lời được chấp nhận là cho tôi một ngoại lệ PDO. Chỉ một cuộc gọi thời gian () đơn giản làm việc cho trường "dấu thời gian"!

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

-1

sử dụng thời gian () và hoạt động tốt ....

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.