Drupal 7 : 날짜, 날짜 (ISO 형식) 및 날짜 (유닉스 타임 스탬프)에서 프로그래밍 방식으로 날짜 필드 설정


11

은 Using 양식 APIhook_form_alter를 () 내가 수동으로 유효한 유닉스 타임 스탬프를 사용하여 드루팔 7의 날짜 필드 유형 각각에 대해 (힘)의 값을 설정하는 방법?

양식이 최종 제출되면 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

date ( 'Ym-d', strtotime ('31 May 2011 ')) 및 time () 모두 항상 비어 있습니다. 날짜에 잘못된 배열을 사용하고 있다고 생각하기 시작했습니다. $ 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 2016 년

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"(날짜) 등과 같이 0으로 채울 수 있습니다. 날짜 스탬프의 경우 예를 들어 strtotime ( "2011-05-25").

중요 : 지정한 정확한 값은 데이터베이스에 저장되지만 사이트에 표시되는 실제 시간은 시간대 설정에 따라 다를 수 있습니다. 새로운 datetime / date / datestamp 필드를 만들면 5 가지 시간대 처리 방법 중에서 선택할 수 있습니다. 기본은 "사이트의 시간대"입니다.

필드에 데이터를 입력 할 때 입력 한 데이터는 사이트의 시간대에있는 것으로 가정합니다. 데이터가 데이터베이스에 저장되면 UTC로 변환됩니다. 그러나 위의 예와 같이 프로그래밍 방식으로 날짜 필드를 설정하면 변환이 수행되지 않으므로 필드의 시간대 설정을 고려해야합니다. 즉, "사이트의 시간대"를 사용하는 경우 시간이 UTC인지 확인하십시오.

이 정보는 fooninja의 블로그에있는 날짜 필드 (날짜 시간, 날짜, 날짜 스탬프 ) 섹션에서 참조되었습니다 .

또한 Drupal 7에서 프로그래밍 방식 노드 생성을위한 훌륭한 일반 리소스입니다.


당신은 가치 키 주위에 따옴표가 필요합니다
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]에서 노드 presave를 찾았습니다.
Citricguy

hook_form_alter와 함께 작동하지 않습니다 ... 어떤 도움이 필요하십니까?
Rajesh Vishwakarma

2

Date의 경우 현재 날짜를 얻기 위해 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

이 시도:

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

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"필드에는 간단한 time () 호출 만 작동했습니다!

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

-1

시간 ()을 사용하고 정상적으로 작동했습니다 ....

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.