2011-12-15 17 views
7

Mam wielostronicowy formularz. Odwiedź stronę 1, strona 2, a następnie stronę 3. Naciśnij przycisk odświeżania (f5), a formularz wróci do strony 2.Drupal wieloformatowy traci stan po odświeżeniu strony

To jest z drupal-6. Problem wygląda podobnie do tego http://drupal.org/node/1060290.

Kopiowanie problemu poprzez tabelę bazy danych form_cache. Pojawiają się tam zarówno dane strony 1, jak i 2. W debugerze php wygląda na to, że został utworzony nowy identyfikator formularza. to znaczy. storage_form-1add3819cbea88139679819935a69686 jest kluczem w tabeli pamięci podręcznej bazy danych, a formularz-bcf9556f57f5352a57dfbba4c2120ee7 jest "identyfikatorem formularza" podczas odświeżania.

Jak wygląda mój kod formularza?

Główna funkcja forma:

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'); 

I załatwiamy złożyć:

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'; 
} 
} 
+0

Czy masz '# ajax' lub' # ahah' elementów? Ponieważ w przypadku rzeczy są nieco inne. Możesz zajrzeć tutaj: http://drupal.org/node/650016 – Max

+0

To jest dobra uwaga. Poprzednia strona, która zawodzi, robi #ahah. Drupal robi "nową pamięć podręczną", a następnie usuwa starą pamięć podręczną. Ale w tym przypadku nie ma wskaźnika do nowej pamięci podręcznej. Nie można też znaleźć miejsca, w którym można by umieścić to w SESJI. Nie buforuje dopóki nie zbuduje formularza, a wtedy otrzymasz tylko ciąg znaków. Nadal poszukuje. – Interlated

+0

Nie sądzę, abyś musiał uciekać się do sesji, aby zapisać swoje dane. Najlepiej byłoby znaleźć dobry działający przykład wielostopniowej postaci z elementami # # aha. Niestety nie mogę o tym myśleć, ale musi istnieć moduł. Oto fajny artykuł od kogoś, kto najwyraźniej borykał się z tym samym co ty: http://www.designend.net/en/webmaster-blog,drupal-ahah-multistep-ahah-forms-with-proper-ahah- zachowanie – Max

Odpowiedz

Powiązane problemy