Drupal Form API и $ form_state ['storage'] уничтожаются при обновлении страницы - PullRequest
4 голосов
/ 28 февраля 2010

У меня есть форма, которая отображает две кнопки отправки. Первая кнопка отправки устанавливает значение $ 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'] должен быть заполнен, а отображаемое сообщение должно быть "success". Однако, глядя на дамп $ form_state, вы увидите, что $ form_state ['storage'] равно NULL после обновления страницы. Я не могу сказать, неверна ли логика кода или очищается ли $ form_state ['storage'] при обновлении страницы.

Есть идеи?

Спасибо за вашу помощь.

Ответы [ 2 ]

8 голосов
/ 27 января 2011

Вам нужно будет перестроить форму в конце обработки 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;
}

Надеюсь, это поможет, Сарфараз

1 голос
/ 28 февраля 2010

Хранилище после отправки будет очищено, используйте $ _SESSION ['mymodule_test_XXX'] для хранения в многошаговых формах ...

...