Mendapatkan kesalahan "Formulir telah kedaluwarsa"

12

Saya memiliki bentuk simpul multistep. Setengah jalan melalui formulir melalui dialog sembulan pengguna diminta untuk masuk jika mereka belum masuk sebelumnya.

Setelah berhasil masuk ketika melanjutkan dengan halaman berikutnya dari bentuk simpul, saya mendapatkan kesalahan validasi ini:

Formulir telah menjadi usang. Salin semua karya yang belum disimpan dalam formulir di bawah ini dan muat ulang halaman ini.

Saya mengerti itu karena drupal_validation_form()memverifikasi $form['#token']dan $form_state['values']['form_token']sama.

Bagaimana saya menghindari ini, karena ini adalah kasus penggunaan khusus (dan itu bukan pemalsuan oleh beberapa barang eksternal).

Adakah masukan di bagian depan ini?

pencarian
sumber
1
Mungkin sudah terlambat untuk menjawab tetapi saya telah mendorong masalah yang sama. Saya menemukan masalah dengan $ form ["# token"] = drupal_get_token ($ form ['# form_id']); ketika saya menyiapkan $ form saya.
1
Saya benar-benar mengkodekan formulir ke dalam sebuah halaman, dan perlu menambahkan token. Dengan menambahkan <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>formulir itu dapat mengirimkan dengan benar.
Thirdender

Jawaban:

2

Posting Anda baru saja menyelamatkan saya dari kesengsaraan serius. Tidak tahu bagaimana koneksi itu dibuat tetapi posting Anda membawa saya ke perubahan kecil dalam kode modul saya. Mudah dimengerti mengapa kesalahan "Formulir telah menjadi usang" terjadi sekarang. Jadi, lihat apakah ini bisa menyentakkan pikiran dan membantu kasus Anda.

Admin halaman / mymod saya telah mengatur item menu yang mencakup yang berikut ini.

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

Dalam mymod_main($op = '')kondisi saya membangun satu dari 2 bentuk tetapi setiap bangunan tentu saja bentuk baru, misalnya $build['mymod_admin'] = drupal_get_form('mymod_admin')atau $build['mymod_delete'] = drupal_get_form('mymod_delete').

Tidak masalah ketika halaman admin / mymod pertama kali dimuat dan mymod_admin dipanggil. Tetapi ketika tombol kirim dibuat di mymod_admin diklik maka mymod_delete dipanggil dan membuat formulir itu. Muncul kesalahan "Formulir telah menjadi usang" yang merusak pemrosesan formulir. Cara mengatasinya hanya untuk digunakan mymod_main()sebagai panggilan balik halaman.

Sekarang tidak ada persimpangan formulir ketika halaman admin / mymod memuat ulang untuk masing-masing formulir karena tidak ada formulir awal dari panggilan balik manu dan kemudian bentuk kedua didefinisikan dalam $build.

Randy Skretka
sumber
Bisakah Anda menjelaskan 'perbaikan' Anda, saya pikir saya memiliki masalah yang sama tetapi saya tidak mengerti apa yang Anda maksud dengan '---' dan '+++', terima kasih
iain maitland
Ini berarti pemanggilan kembali halaman diubah menjadi mymod_main().
kiamlaluno
0

Kesalahan berarti bahwa form_tokenkebutuhan tidak valid dan perlu dibuat ulang. Ini pada dasarnya adalah bidang formulir tersembunyi (umumnya digunakan untuk melindungi terhadap pemalsuan lintas situs).

Biasanya elemen token secara otomatis ditambahkan ke setiap formulir Drupal drupal_prepare_form(), jadi Anda biasanya tidak perlu menambahkan sendiri, kecuali Anda sedang menulis kode Anda sendiri.

Jika Anda mencoba memprogram beberapa formulir multi-halaman, Anda mungkin perlu membuat ulang token pada setiap pengiriman menggunakan drupal_get_token(), misalnya seperti yang ditunjukkan di sini :

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

Adapun solusi untuk memaksa regenerasi token formulir di form_alter, periksa contoh berikut:

/**
 * 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'),
      );
    }
}

Penyelesaian masalah

  • Periksa ulang apakah formulir Anda tidak dikodekan, jika tidak tambahkan token seperti yang disarankan oleh @thirdender :

    <input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>
  • Periksa apakah kesalahan terjadi pada formulir Anda, seperti yang bisa terjadi pada formulir lain (mis. Formulir di dalam formulir).

  • Debug drupal_valid_token().
kenorb
sumber