Drupal 7のプログラムで日付フィールドを設定:日付、日付(ISO形式)、日付(Unixタイムスタンプ)


11

使用してフォームAPIhook_form_alterを()有効なUNIXタイムスタンプを使用してDrupalの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();
}

fieldsウィジェットがテキストに設定されており、そのフォーマットは「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 2012年

フォームが最終的に送信されると、field_date型は常に空の配列になります。
Citricguy 2012年

設定しようとしました$form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']か?
Countzero

カスタムコードを削除して、UIからフォームを送信し、フィールドからネイティブに保存された形式を確認してみませんか?
WestieUK 2012年

回答:


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 2017年

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"(datetime)、 "2011-00-00T00:00:00"(date)など。日付スタンプの場合は、たとえば、strtotime( "2011-05-25")を実行します。

重要:また、指定した正確な値はデータベースに保存されますが、サイトに表示される実際の時間はタイムゾーンの設定によって異なる場合があることに注意してください。新しいdatetime / date / datestampフィールドを作成すると、5つの異なるタイムゾーン処理方法から選択できます。デフォルトは「サイトのタイムゾーン」です。

フィールドにデータを入力するとき、入力されたデータはサイトのタイムゾーンであると想定されます。データがデータベースに保存されると、UTCに変換されます。ただし、上記の例のようにプログラムで日付フィールドを設定した場合、変換は行われないため、フィールドのタイムゾーン設定を考慮してください。または、「サイトのタイムゾーン」を使用する場合は、時刻がUTCであることを確認してください。

この情報は、fooninjaのブログの「日付フィールド(datetime、date、 datesamp )」というセクションから参照されました。

これは、Drupal 7でのプログラムによるノード作成のための優れた一般リソースでもあります。


値のキーを
囲む

マスターチーフ、ありがとう!あなたの改善を反映するために更新されました。
MD3 2013

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 2012年

$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

これを試して:

$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';
  }

または、1つのカスタムフィールド(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

time()を使用して問題なく動作しました...。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.