web-dev-qa-db-ja.com

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

フォームAPI および hook_form_alter() を使用して、Drupal 7の日付フィールドタイプのそれぞれの値を手動で設定(強制)するにはどうすればよいですか?有効なUnixタイムスタンプを使用していますか?

フォームが最終的に送信されると、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ウィジェットがテキストに設定されており、そのフォーマットは「Y-m-d H:i:s」です。

date('Y-m-d H:i:s', time())の代わりにtime()も試しました。

dpm ()の出力。

Example dpm() output

また、回避策として hook_node_presave ()でフィールドを変更すると、フィールドを設定できることにも注意してください。これを行うには、$node->field_date['und'][0]['value'] = date('Y-m-d H:i:s', $my_unix_timestamp);を設定します。代わりに、hook_form_alterを使用してこれを行う方法を理解したいと思います。

11
Citricguy

これは私にとって正しいサイトのタイムゾーンを扱うコードです:

 $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',
  );
14
Vadym Myrgorod

各日付フィールドタイプは、異なるフォーマットのタイムスタンプを期待しています(データベースでの格納方法に基づく):

// 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のブログの Dateフィールド(datetime、date、datesamp) というラベルの付いたセクションから参照されました。

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

6
MD3

これでうまくいきました。

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

日付については、現在の日付を取得するための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);

});
2
Nitesh Sethia

time()値は、このレベルでは機能しません。

あなたは次のようなものを使わなければなりません:

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

$ 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
Francisco Luz

日付フィールドに値を設定するには、以下のコードに従ってください。

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 ;
   }
}
1
Aswini K

これを試して:

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

フィールドタイプDate (ISO format)を使用している場合は、次を使用します。

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

受け入れられた答えは私にPDO例外を与えていました。 "datestamp"フィールドでは、単純なtime()呼び出しのみが機能しました。

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