フォーム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 ()の出力。
また、回避策として hook_node_presave ()でフィールドを変更すると、フィールドを設定できることにも注意してください。これを行うには、$node->field_date['und'][0]['value'] = date('Y-m-d H:i:s', $my_unix_timestamp);
を設定します。代わりに、hook_form_alterを使用してこれを行う方法を理解したいと思います。
これは私にとって正しいサイトのタイムゾーンを扱うコードです:
$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',
);
各日付フィールドタイプは、異なるフォーマットのタイムスタンプを期待しています(データベースでの格納方法に基づく):
// 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.でのプログラムによるノード作成のための優れた一般リソースでもあります。
これでうまくいきました。
$node->field_date[LANGUAGE_NONE][0] = array(
'value' => date('Y-m-d H:i:s', strtotime('now')),
'timezone' => 'UTC',
'timezone_db' => 'UTC',
);
日付については、現在の日付を取得するための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);
});
time()
値は、このレベルでは機能しません。
あなたは次のようなものを使わなければなりません:
$mydate = date('Y-m-d', strtotime('31 May 2011'));
$ 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';
日付フィールドに値を設定するには、以下のコードに従ってください。
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 ;
}
}
これを試して:
$now = date_now('UTC');
$now = date_format($now, "Y-m-d H:i:s");
フィールドタイプDate (ISO format)
を使用している場合は、次を使用します。
$node->field_datetest[$node->language][0][value] = "2011-05-25T10:35";
受け入れられた答えは私にPDO例外を与えていました。 "datestamp"フィールドでは、単純なtime()呼び出しのみが機能しました。
$entity->field_upload_time["und"][0]["value"] = time();