it-swarm-id.com

Form Redirect tidak berfungsi jika 'tujuan' ada di URL

Di salah satu formulir saya, saya mencoba menetapkan $form_state['redirect'] Sehingga formulir akan pergi ke tujuan itu setelah pengguna mengklik salah satu tombol tindakan.

Jika saya memeriksa $form_state['redirect'] Baik sebelum dan sesudah saya menambahkan arahan ulang, itu NULL sebelum, dan setelah berisi array yang tepat. Inilah cara saya mengatur pengalihan:

$form_state['redirect'] = array(
  'my/custom/path/' . $nid,
  array('query' => drupal_get_destination()),
);

Saya ingin mempertahankan tujuan dari bentuk yang dilihat pengguna ke jalur berikutnya (itu sebabnya saya memanggil drupal_get_destination(), yang mengembalikan array dengan 'destination' => 'some/path/here' Di dalamnya.

Tampaknya, karena sudah ada tujuan di jalur formulir saat ini, formulir dialihkan ke tujuan itu tidak peduli apa yang saya masukkan ke formulir saya sendiri menyerahkan penangan (lihat kode di atas). Saya bahkan mencoba menggunakan drupal_goto () dan itu tidak mengarahkan pengguna juga.

19
geerlingguy

Saat formulir diproses, nilai $form_state['redirect'] Dikirim ke drupal_goto() , dan drupal_goto() selalu berpihak pada $_GET['destination'] Lebih dari parameter $path sendiri.

Demi kelengkapan, di Drupal 6, Anda agak kurang beruntung tanpa mengatur header Anda sendiri di hook_exit() :

function mymodule_exit($destination = NULL) {
  $my_destination = 'foo/bar';
  header('Location: ' . url($my_destination));
  exit;
}

Dalam Drupal 7, hook_drupal_goto_alter() ditambahkan untuk kasus penggunaan khusus ini:

function mymodule_drupal_goto_alter(&$path, &$options, &$http_response_code) {
  $path = 'foo/bar';
}

Pilihan lain untuk Drupal 7, yang lebih dekat dengan apa yang ingin Anda lakukan, adalah mengatur ulang cache statis untuk drupal_get_destination() di dalam handler kirim Anda menggunakan drupal_static_reset() :

function mymodule_form_submit($form, &$form_state) {
  // See note
  $form_state['redirect'][] = drupal_get_destination();
  $form_state['redirect'][] = 'foo/bar';

  unset($_GET['destination']);
  drupal_static_reset('drupal_get_destination');
  drupal_get_destination();
}

Karena Anda memanggil drupal_get_destination() segera setelah reset, Drupal tidak menyadari parameter tujuan untuk sisa halaman yang dibuat, termasuk ketika ia memanggil drupal_goto().

Catatan: Saya mengubah kode untuk mendefinisikan $form_state['redirect'] Karena Anda tidak pernah ingin menimpa variabel: penangan pengirim lain mungkin telah menentukan sendiri arahan ulang. Drupal akan selalu menggunakan item last dalam array, jadi jika Anda ingin foo/bar Mengganti parameter tujuan (dan setiap pengalihan lainnya ditentukan hingga saat itu), itu harus menjadi yang terakhir.

27
user7

Terima kasih untuk ini, tetapi untuk beberapa alasan ini tidak berhasil ketika saya mencobanya. Saya mendapat kesalahan fatal - data yang dikirim dalam contoh jawaban di atas tidak memenuhi persyaratan drupal_goto()

Mungkin karena jawaban ini agak lama, tetapi saya dapat membuatnya bekerja dengan ini sebagai gantinya:

function mymodule_form_submit($form, &$form_state) {


  $form_state['redirect'] = array(
    'foo/bar', array(
      'query' => drupal_get_destination()
    )
  );

  unset($_GET['destination']);
  drupal_static_reset('drupal_get_destination');
  drupal_get_destination();

}

Saya tahu ini melanggar catatan ini:

anda tidak pernah ingin menimpa variabel: penangan kiriman lain mungkin telah mendefinisikan pengalihan mereka sendiri.

Tapi, dalam hal ini, Anda tentu ingin menimpa variabel. Anda tidak akan menetapkan nilai ini kecuali Anda ingin mengabaikan nilai set modul lain. Juga, saya pikir Anda harus karena cara drupal_goto() bekerja dengan parameter kueri. Ini mungkin juga mengapa jawaban asli melemparkan kesalahan fatal di situs saya.

4
tmsimont