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?
<input name='form_token' type='hidden' value='<?php print drupal_get_token('MY_FORM_ID'); ?>'>
formulir itu dapat mengirimkan dengan benar.Jawaban:
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.
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
.sumber
mymod_main()
.Kesalahan berarti bahwa
form_token
kebutuhan 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 :Adapun solusi untuk memaksa regenerasi token formulir di form_alter, periksa contoh berikut:
Penyelesaian masalah
Periksa ulang apakah formulir Anda tidak dikodekan, jika tidak tambahkan token seperti yang disarankan oleh @thirdender :
Periksa apakah kesalahan terjadi pada formulir Anda, seperti yang bisa terjadi pada formulir lain (mis. Formulir di dalam formulir).
drupal_valid_token()
.sumber