Drupal multi-form теряет состояние при обновлении страницы - PullRequest
7 голосов
/ 15 декабря 2011

У меня есть многостраничная форма.Перейдите на страницу 1, страницу 2, а затем на страницу 3. Нажмите «Обновить» (f5), и форма вернется на страницу 2.

Это с drupal-6.Проблема выглядит примерно так: http://drupal.org/node/1060290.

Раскрытие проблемы с помощью таблицы базы данных form_cache.Обе страницы 1 и 2 данные появляются там.В отладчике PHP выглядит так, как будто новый form_id был создан.то есть.storage_form-1add3819cbea88139679819935a69686 - это ключ в таблице кэша базы данных, а form-bcf9556f57f5352a57dfbba4c2120ee7 - это «form_id» при обновлении.

Как выглядит мой код формы?

Основная функция формы:

function myform_online(&$form_state) {
  // $form_state['storage']['step'] keeps track of what page we're on.
  // start at step 1 if no storage has been set
  if (!isset($form_state['storage']['step'])) {
    $form_state['storage']['step'] = 1;
 }

 // If we are saving the form data we should submit rather than display the details.
 // At least look at saving the step.

 // Don't lose our old data when returning to a page with data already typed in.
 $default_values = array();
 if (isset($form_state['storage']['values'][$form_state['storage']['step']])) {
    $default_values = $form_state['storage']['values'][$form_state['storage']['step']];
 }

 switch ($form_state['storage']['step']) {
    case 1:
        // Your Details
        module_load_include('inc', 'join_online', 'includes/step1'); 

И мы обрабатываем submit:

function join_online_submit($form, &$form_state) {
//Save the values for the current step into the storage array.
//dsm($form_state); 

$form_state['storage']['values'][$form_state['storage']['step']] = $form_state['values'];

# ahah - bail.
if ($form_state['ahah_submission']) {
    return;
}

// How do we work out if this was a refresh? It currently does start with 1 and think that the step is #2. 

//Check the button that was clicked and change the step.
if ($form_state['clicked_button']['#id'] == 'edit-previous') {
    $form_state['storage']['step']--;
} elseif ($form_state['clicked_button']['#id'] == 'edit-next') {
    $form_state['storage']['step']++;
} elseif ($form_state['clicked_button']['#id'] == 'edit-finish') {
    //You should store the values from the form in the database here.
    //We must do this or the form will rebuild instead of refreshing.
    unset($form_state['storage']);

    //Go to this page after completing the form.
    $form_state['redirect'] = 'join_online/form/thank-you';
}
}

1 Ответ

1 голос
/ 05 июня 2012

Если вы используете $ form_state ['rebuild'] = TRUE в функции _submit, состояние формы сохраняется и может использоваться для значений по умолчанию.

Проверьте этот пример: http://www.ferolen.com/blog/how-to-create-multistep-form-in-drupal-6-tutorial/

...