1

私はDrupalモジュールを書いていますが、些細な問題に遭遇しました。

「生年月日」プロパティを含む「Person」タイプのノードについて考えてみます。日付をUNIX形式(Drupal Coreと同じ)で格納するためにintフィールドを使用するようにデータベーステーブルを構成しましたが、もちろん、ユーザーがよりわかりやすい形式、つまりdd/で値を指定するためのメソッドを提供する必要があります。 mm/yyyy。

私のモジュールPerson_form関数では、次のようにdate要素を構成しました。

$form['dob'] = array(
    '#type' => 'date',
    '#title' => 'Date of Birth',
    '#required' => TRUE,
    '#default_value' => array(
       'day' => format_date($node->dob, 'custom', 'j'),
       'month' => format_date($node->dob, 'custom', 'n'),
       'year' => format_date($node->dob, 'custom', 'Y'),
    ),
);

これは、データベース内のUNIXの日付を3つのドロップダウンリストに表示します。1つは日、月、年です。これは私が望んでいたことであり、これまでのところ非常に優れています。

ここで、ユーザーが[保存]ボタンをクリックしたときにこの要素の値にアクセスできるようにする必要がありますが、2つの問題があります。

  1. _form関数のシグネチャはPerson_form($ node)なので、$ form ['dob'] ['day' /'month'/'year']の値にアクセスするにはどうすればよいですか。$ formは、引数として関数に渡されません。
  2. 値を取得したら、UNIXの日付値を生成する最良の方法は何ですか?

私はしばらくの間グーグルで検索しましたが、「drupal」と「date」という用語は、Dateモジュールの拡張子を指しているようです-確かに、このような単純な日付を処理するための拡張子は必要ありません:-o

前もって感謝します

4

3 に答える 3

2

保存時に呼び出される関数のシグネチャは、である必要がありますperson_form_submit($form, &$form_state)。これから、$form_state配列を使用して値を取得し、必要に応じて処理できます。フォームビルダー関数としてperson_form($node)使用する必要のあるフォームをビルドするために、を使用することについてではありません。person_form($form_state)Drupalでフォームを作成するためのドキュメントを確認してください:http://drupal.org/node/751826

日付からタイムスタンプを取得するには、php関数strtotime()を使用します。

于 2010-08-06T12:51:53.597 に答える
2

hook_form()は、既存のノードを編集したり、新しいノードを作成したりするためのフォームフィールドを表示するために呼び出されます。最初のケースでは、表示する値はにすでに存在する値です$nodehook_load()ノードに関連付けられた値をロードするために呼び出される前です。戻り値は、ノードオブジェクトに追加されるアイテムの配列です(たとえば、返された配列がarray('extra_field' => 'value')、の場合、ノードにはプロパティがあります$node->extra_field)。 hook_update()ノードがデータベースに保存されるときに呼び出され(コンテンツタイプを実装するモジュールは、データベーステーブルに独自の値を保存する必要があります)、hook_validate()ユーザーから入力された値を検証するために呼び出されます。

日、月、年がmktime()あるので、Unixタイムスタンプを取得するために使用できます。取得するタイムスタンプは、その日の深夜に設定されます。

さまざまなボタンのさまざまな送信ハンドラーについてのコメントで私が言ったことを明確にするために、これは以下によって使用されるコードですnode_form()

$form['buttons'] = array();
$form['buttons']['submit'] = array(
  '#type' => 'submit',
  '#access' => !variable_get('node_preview', 0) || (!form_get_errors() && isset($form_state['node_preview'])),
  '#value' => t('Save'),
  '#weight' => 5,
  '#submit' => array('node_form_submit'),
);
$form['buttons']['preview'] = array(
  '#type' => 'submit',
  '#value' => t('Preview'),
  '#weight' => 10,
  '#submit' => array('node_form_build_preview'),
);
if (!empty($node->nid) && node_access('delete', $node)) {
  $form['buttons']['delete'] = array(
    '#type' => 'submit',
    '#value' => t('Delete'),
    '#weight' => 15,
    '#submit' => array('node_form_delete_submit'),
  );
}

各ボタンには、独自の送信ハンドラー(アイテムで定義#submit)があります。で送信ハンドラーを設定する$form$form['#submit'] = 'submission_function'、その送信ハンドラーは、独自の送信ハンドラーを定義しないすべてのボタンで使用されます。

よりわかりやすい形式、つまりdd / mm/yyyyで値を指定するためのメソッドをユーザーに提供する必要があります。

日、月、年の3つのテキストフィールドを使用できます(インラインで表示することができ、/それらの間に配置する場所はを使用して設定されます'#field_suffix' => '/')。日付フォームフィールドを使用する利点は、サイトに設定された日付形式に基づいて、日、月、および年のフィールドが並べ替えられることです。日付形式に日と月の前の年が表示されている場合、日付フィールドにも他の2つのフィールドの前の年が表示されます。もう1つの利点は、ユーザーから取得した入力を検証するためにカスタムコードを作成する必要がないことです。
日付フィールドの値は、インデックスの日、月、および年を含む配列です。

于 2010-08-06T13:46:51.047 に答える
0
$d = $form_state['values']['dob'];
$mydateval = $d['year'].'-'.$d['month'].'-'.$d['day'];
于 2010-12-14T11:08:46.647 に答える