【问题标题】:Drupal Form API and $form_state['storage'] is destroyed on a page refreshDrupal Form API 和 $form_state['storage'] 在页面刷新时被销毁
【发布时间】:2010-02-28 01:11:25
【问题描述】:

我有一个显示两个提交按钮的表单。第一个提交按钮将 $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!'));
        }
}

当您单击第一个提交按钮时,$form_state['storage'] 已正确设置。当您单击第二个提交按钮时,将显示消息“成功”。到现在为止还挺好。现在进行页面刷新。消息“失败!”显示出来。

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

有什么想法吗?

感谢您的帮助。

【问题讨论】:

    标签: php drupal drupal-6 drupal-fapi


    【解决方案1】:

    您需要在处理 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;
    }
    

    希望这会有所帮助, 萨法拉兹

    【讨论】:

      【解决方案2】:

      提交后的存储将被清除,使用 $_SESSION['mymodule_test_XXX'] 存储在多步骤表单中...

      【讨论】:

        猜你喜欢
        • 2011-03-22
        • 2017-11-19
        • 1970-01-01
        • 2013-10-24
        • 1970-01-01
        • 2016-11-19
        • 1970-01-01
        • 2017-10-24
        • 1970-01-01
        相关资源
        最近更新 更多