Drupal Form API和$ form_state ['storage']在页面刷新时被销毁

Ana*_*ica 4 php drupal drupal-6 drupal-fapi

我有一个显示两个提交按钮的表单.第一个提交按钮将$ form_state ['storage']设置为一个值.第二个提交按钮然后读取此$ 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!'));
        }
}
Run Code Online (Sandbox Code Playgroud)

单击第一个提交按钮时,$ form_state ['storage']已正确设置.单击第二个提交按钮时,将显示消息"成功".到现在为止还挺好.现在做一个页面刷新.消息"失败!" 被展示.

所以一切正常,直到页面刷新.页面刷新本质上只调用第二个提交函数.理论上,$ form_state ['storage']仍应填充,显示的消息应为"成功".但是,看一下$ form_state转储显示页面刷新后$ form_state ['storage']为NULL.我无法判断我的代码逻辑是否错误,或者是否在页面刷新时清除了$ form_state ['storage'].

有任何想法吗?

谢谢你的帮助.

Sar*_*mro 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;
}
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助,Sarfaraz