2011-12-15 34 views
7

Tôi có một biểu mẫu nhiều trang. Truy cập trang 1, trang 2 và sau đó trang 3. Nhấn làm mới (f5) và biểu mẫu quay lại trang 2.Nhiều hình thức Drupal mất trạng thái làm mới trang

Đây là với drupal-6. Vấn đề trông giống như thế này http://drupal.org/node/1060290.

Tìm hiểu sự cố, thông qua bảng cơ sở dữ liệu form_cache. Cả dữ liệu trang 1 và 2 đều xuất hiện trong đó. Trong trình gỡ rối php, có vẻ như một form_id mới đã được tạo. I E. storage_form-1add3819cbea88139679819935a69686 là khóa trong bảng bộ đệm cơ sở dữ liệu và biểu mẫu-bcf9556f57f5352a57dfbba4c2120ee7 là 'form_id' khi làm mới.

Mã biểu mẫu của tôi trông như thế nào?

chính thức chức năng:

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

Và chúng tôi xử lý nộp:

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

Bạn có '# ajax' hoặc' # ahah' yếu tố? Bởi vì trong trường hợp mọi thứ có một chút khác biệt. Bạn có thể muốn có một cái nhìn ở đây: http://drupal.org/node/650016 – Max

+0

Đó là một điểm tốt. Trang trước với trang không thành công #ahah. Drupal có 'cache mới' sau đó xóa cache cũ. Nhưng không có con trỏ đến bộ nhớ cache mới khi bạn làm mới trong trường hợp này. Cũng không thể tìm thấy một nơi để đưa nó vào SESSION. Không cache cho đến khi nó xây dựng form và sau đó tất cả các bạn nhận được là một chuỗi. Vẫn đang nhìn. – Interlated

+0

Tôi không nghĩ bạn phải sử dụng phiên để lưu dữ liệu của mình. Điều tốt nhất là tìm một ví dụ làm việc tốt về dạng đa bước với các phần tử '# ahah' và bắt đầu từ đó. Thật không may tôi không thể nghĩ ra một nhưng có phải là một mô-đun ra khỏi đó. Đây là một bài viết hay từ một người nào đó dường như đang vật lộn với cùng một thứ như bạn: http://www.designend.net/en/webmaster-blog,drupal-ahah-multistep-ahah-forms-with-proper-ahah- hành vi – Max

Trả lời

Các vấn đề liên quan