Bắt lỗi Các hình thức đã trở nên lỗi thời


12

Tôi có một hình thức nút nhiều bước. Một nửa thông qua biểu mẫu thông qua một hộp thoại bật lên người dùng được yêu cầu đăng nhập nếu họ chưa đăng nhập trước.

Khi đăng nhập thành công khi tiếp tục với trang tiếp theo của mẫu nút, tôi gặp lỗi xác thực này:

Các hình thức đã trở nên lỗi thời. Sao chép bất kỳ công việc chưa được lưu trong mẫu dưới đây và sau đó tải lại trang này.

Tôi hiểu nó là bởi vì drupal_validation_form()xác minh $form['#token']$form_state['values']['form_token']là như nhau.

Làm thế nào để tôi tránh điều này, vì đây là trường hợp sử dụng đặc biệt (và nó không giả mạo bởi một số nội dung bên ngoài).

Bất kỳ đầu vào trên mặt trận này?


1
Có lẽ đã quá muộn để trả lời nhưng tôi đã gặp phải vấn đề tương tự. Tôi đã tìm thấy sự cố với $ form ["# token"] = drupal_get_token ($ form ['# form_id']); khi tôi chuẩn bị mẫu $ của tôi.

1
Tôi thực sự khó mã hóa một biểu mẫu vào một trang và cần thêm mã thông báo. Bằng cách thêm <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>các hình thức đã có thể gửi đúng.
thứ ba

Câu trả lời:


2

Bài viết của bạn chỉ cứu tôi khỏi đau khổ nghiêm trọng. Không biết kết nối đó được tạo ra như thế nào nhưng bài đăng của bạn dẫn tôi đến một thay đổi nhỏ trong mã mô-đun của tôi. Dễ hiểu tại sao bây giờ lỗi "Biểu mẫu đã trở nên lỗi thời" đã xảy ra. Vì vậy, xem nếu điều này có thể chạy bộ suy nghĩ của bạn và giúp đỡ cho trường hợp của bạn.

Quản trị viên trang của tôi / mymod đã có một mục menu được thiết lập bao gồm các mục sau.

'page callback' => 'drupal_get_form', 
'page arguments' => 'mymod_main',

Trong mymod_main($op = '')tôi có điều kiện xây dựng một trong 2 hình thức nhưng mỗi bản dựng tất nhiên là một hình thức mới, ví dụ $build['mymod_admin'] = drupal_get_form('mymod_admin')hoặc $build['mymod_delete'] = drupal_get_form('mymod_delete').

Không có vấn đề khi quản trị viên trang / mymod được tải lần đầu tiên và mymod_admin được gọi. Nhưng khi nút gửi được tạo trong mymod_admin được nhấp thì mymod_delete được gọi và tạo biểu mẫu của nó. Đã xuất hiện lỗi "Biểu mẫu đã trở nên lỗi thời" làm hỏng quá trình xử lý biểu mẫu. Cách khắc phục chỉ đơn giản là sử dụng mymod_main()như gọi lại trang.

Bây giờ không có biểu mẫu chéo khi trang quản trị / mymod tải lại cho mỗi biểu mẫu vì không có biểu mẫu bắt đầu từ cuộc gọi lại manu và sau đó là biểu mẫu thứ hai được xác định trong $build.


Bạn có thể giải thích 'cách khắc phục' của mình không, tôi nghĩ tôi có cùng một vấn đề nhưng tôi không hiểu ý của bạn với '---' và '+++', cảm ơn bạn
iain maitland

Nó có nghĩa là gọi lại trang đã được thay đổi thành mymod_main().
kiamlaluno

0

Lỗi có nghĩa là form_tokennhu cầu không hợp lệ và cần được phục hồi. Về cơ bản, đây là một trường mẫu ẩn (thường được sử dụng để bảo vệ chống lại các giả mạo chéo trang web).

Thông thường, một phần tử mã thông báo được tự động thêm vào mỗi biểu mẫu Drupal drupal_prepare_form(), do đó, bạn thường không phải tự thêm một phần, trừ khi bạn đang viết mã của riêng mình.

Nếu bạn đang cố gắng lập trình một số biểu mẫu nhiều trang, có lẽ bạn cần phải tạo lại mã thông báo trên mỗi lần gửi bằng cách sử dụng drupal_get_token(), ví dụ như được hiển thị ở đây :

$form_state['input']['form_token'] = drupal_get_token($form['#token']);

Đối với cách giải quyết để buộc tái tạo mã thông báo biểu mẫu trong form_alter, hãy kiểm tra ví dụ sau:

/**
 * Implements hook_form_alter().
 */
function mymodule_form_alter(&$form, &$form_state, $form_id) {
    if ($form_id === 'your_form_entityform_edit_form' && !empty($form_state['input']['form_id'])) {
      $form_id = $form_state['input']['form_id'];
      $form ['#token'] = $form_id;
      $form ['form_token'] = array(
        '#id' => drupal_html_id('edit-' . $form_id . '-form-token'),
        '#type' => 'token',
        '#default_value' => drupal_get_token($form['#token']),
        '#parents' => array('form_token'),
      );
    }
}

Xử lý sự cố

  • Kiểm tra kỹ nếu biểu mẫu của bạn không được mã hóa cứng, nếu không hãy thêm mã thông báo theo đề xuất của @thirdender :

    <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>
  • Kiểm tra xem lỗi xảy ra trên biểu mẫu của bạn, như có thể xảy ra trên biểu mẫu khác (ví dụ: biểu mẫu trong biểu mẫu).

  • Gỡ lỗi drupal_valid_token().
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.