1

最近、Ajaxを使用してデータを送信するようにフォームを変更しました。私のフォームはユーザーからの日付を(mm-dd-yyyy)形式で受け入れます。この変更の前に、以下に示す私のhook_submitは、DBに送信する前に(yyyy-mm-dd)形式に変換します。 。変更後は、その手順をスキップして、日付値をそのままDBに送信します。

変換を行う独自の関数を見つけたり作成したりしてもかまいませんが、変換を実行する前に、まずその性質を理解したいと思います。たぶん、後で私を助ける何かを学ぶでしょう。

どんな助けでもいただければ幸いです。

私の質問は、日付値が$form_stateではなく$form_dataで変換されるのはなぜですか?

Drupal7を使用します。

モジュール:Date API、CTools、

//Original submit handler
//Format sent to DB: yyyy-mm-dd <--This is what I want for the Ajax version
function fsa_roster_form_submit($form_id, &$form_data){
$dcc_table = 'dcc_'.$form_data['values']['sid'];
$insertDaycare = db_insert($dcc_table)
    ->fields(array(
        'entered' => $form_data['values']['date_entered'],
        'exited' => $form_data['values']['date_exited'],
    ))
    ->execute();
}

//Ajaxed submit handler:
//Format sent to DB: mm-dd-yyyy
function fsa_roster_form_ajax_submit($form, $form_state) {
    $dcc_table = 'dcc_'.$form_state['input']['sid'];
    $insertRoster = db_insert($dcc_table)
    ->fields(array(
        'entered' => $form_state['input']['date_entered'],
        'exited' => $form_state['input']['date_exited'],
    ))
    ->execute();
}
$form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save Entry'),
    '#prefix' => '<div id="modalSubmit">',
    '#ajax' => array(//Remove this from your imagination for original submit handler
        'callback' => 'fsa_daycare_roster_form_ajax_submit',
        'wrapper' => 'msgBox',
        'method' => 'replace',
        'effect' => 'fade',
    ),
    '#suffix' => '</div><script>addValidationEvents();</script>'
);
4

1 に答える 1

1

その理由は$form_state['input']、AJAX送信コールバックと$form_state['values']通常の送信コールバックで使用しているためです。配列には、処理および検証される前のinputフォームデータが常に含まれますが、values配列には、処理および検証が適用された後の値が含まれます。

したがって、AJAX送信コールバックで同じ効果を実現するには、通常の送信コールバックで行ったのと同じように、以下を使用します。

function fsa_roster_form_ajax_submit($form, $form_state) {
  $dcc_table = 'dcc_'.$form_state['values']['sid'];
  $insertRoster = db_insert($dcc_table)
  ->fields(array(
    'entered' => $form_state['values']['date_entered'],
    'exited' => $form_state['values']['date_exited'],
  ))
  ->execute();
}

Also, for what it's worth, your regular submit callback and the AJAX submit callback both accept the same parameters: $form and $form_state. Though you called them by different variable names in the two functions, they are actually (more or less) identical.

于 2012-08-09T01:56:46.337 に答える