4

2 つの送信ボタンを表示するフォームがあります。最初の送信ボタンは $form_state['storage'] に値を設定します。2 番目の送信ボタンは、この $form_state['storage'] 値を読み取ります。値が設定されている場合は、成功メッセージが表示されます。値が設定されていない場合は、失敗メッセージが表示されます。

私の問題を再現するコードは次のとおりです。

function mymodule_test_admin() {
    return drupal_get_form('mymodule_test_form');
}

function mymodule_test_form(&$form_state) {
    $form['mymodule_test_form1'] = array(
        '#type' => 'fieldset',
        '#title' => t('test 1'),
        '#collapsible' => TRUE,
        '#collapsed' => FALSE,
        '#tree' => TRUE
    );

    $form['mymodule_test_form1']['submit'] = array(
        '#type' => 'submit',
        '#value' => t('button 1'),
        '#submit' => array('mymodule_test_form1_submit')
    );

    $form['mymodule_test_form2'] = array(
        '#type' => 'fieldset',
        '#title' => t('test 2'),
        '#collapsible' => TRUE,
        '#collapsed' => FALSE,
        '#tree' => TRUE
    );

    $form['mymodule_test_form2']['submit'] = array(
        '#type' => 'submit',
        '#value' => t('button 2'),
        '#submit' => array('mymodule_test_form2_submit')
    );

    return $form;
}

function mymodule_test_form1_submit($form, &$form_state) {
    $form_state['storage']['test_1'] = 'test 1';
    drupal_set_message(t('@message', array('@message' => $form_state['storage']['test_1'])));
}

function mymodule_test_form2_submit($form, &$form_state) {
    if (isset($form_state['storage']['test_1'])) {
        drupal_set_message(t('success'));
    }    else {
            drupal_set_message(t('fail!'));
        }
}

最初の送信ボタンをクリックすると、$form_state['storage'] が適切に設定されます。2 番目の送信ボタンをクリックすると、「成功」というメッセージが表示されます。ここまでは順調ですね。ここで、ページを更新します。「失敗!」というメッセージ。表示されています。

そのため、ページが更新されるまですべてが正しく機能します。ページの更新は基本的に、2 番目の送信関数を呼び出すだけです。理論的には、$form_state['storage'] は引き続き入力され、表示されるメッセージは「成功」であるはずです。ただし、$form_state ダンプを見ると、ページの更新後に $form_state['storage'] が NULL であることがわかります。コード ロジックが間違っているのか、ページの更新時に $form_state['storage'] がクリアされているのかわかりません。

何か案は?

ご協力いただきありがとうございます。

4

2 に答える 2

8

form1_submit の処理の最後にフォームを再構築する必要があります。これにより、以前に送信された値がそのまま保持されます。これは多段階フォームのシナリオですが、Drupal 5 で行われた方法とは少し異なります。


function mymoduel_test_form1_submit($form, &$form_state) {
    $form_state['storage']['test_1'] = 'test 1';
    drupal_set_message(t('@message', array('@message' => $form_state['storage']['test_1'])));
    $form_state["rebuild"] = TRUE;
}

これが役に立てば幸いです、Sarfaraz

于 2011-01-27T07:06:41.830 に答える
1

送信後のストレージはクリアされます。マルチステップ フォームでの保存には $_SESSION['mymodule_test_XXX'] を使用します...

于 2010-02-28T02:01:41.097 に答える