Cara mengalihkan ke halaman setelah mengirimkan formulir

24

Saya memiliki modul khusus yang menampilkan formulir.

Setelah mengirimkan formulir, saya ingin mengarahkan pengguna ke halaman lain.

Bagaimana saya bisa melakukan itu?

Carlos Muñiz
sumber

Jawaban:

31

Di dalam penangan kirim Anda lakukan

Drupal 7:

$form_state['redirect'] = 'url';

Drupal 8:

$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);
googletorp
sumber
apakah ada cara alternatif untuk melakukan ini? formulir yang saya butuhkan untuk redirect dibangun dengan handler #submit sendiri (handler submit tidak ditempatkan dalam modul khusus saya), jadi saya tidak memiliki akses ke kode.
Carlos Muñiz
@Charlie gunakan form_alter untuk menambahkan milik Anda.
googletorp
@Charlie jika untuk Anda terutama diakses oleh link, menempatkan parameter tujuan dalam URL: /my-form?destination=node/123.
tostinni
Tidak bekerja pada D7, tetapi saya menemukan sesuatu yang berfungsi. Periksa pesan saya di bawah ini.
Ignacio Segura Postigo
Saya hanya ingin mengucapkan terima kasih untuk menjawab untuk D7, kemudian kembali 5 tahun kemudian untuk memperbarui jawaban untuk D8. <3
semut
17

Perlu dicatat ada beberapa pemicu yang dapat mencegah pengalihan:

  • $form_state['redirect'] === FALSE: Jika disetel, fungsi pembuat formulir atau validasi formulir / ajukan handler tidak ingin pengguna diarahkan, yang artinya drupal_goto()tidak dipanggil. Untuk sebagian besar bentuk, logika pengalihan akan sama terlepas dari apakah $form_state['redirect']tidak didefinisikan atau SALAH. Namun, jika tidak ditentukan dan permintaan saat ini berisi string kueri 'tujuan', drupal_goto()akan mengarahkan ke tujuan yang diberikan sebagai gantinya. Hanya pengaturan $form_state['redirect']ke yang FALSEakan mencegah pengalihan.
  • $form_state['no_redirect'] === TRUE: Ketika disetel, callback yang awalnya membangun formulir secara eksplisit melarang pengalihan apa pun, terlepas dari nilai pengalihan di $form_state['redirect']. Misalnya, ajax_get_form()menentukan $form_state['no_redirect']kapan membuat formulir dalam panggilan balik AJAX untuk mencegah pengalihan. $form_state['no_redirect']tidak boleh diubah oleh fungsi pembuat formulir atau validasi formulir / ajukan penangan.
  • $form_state['programmed'] === TRUE: berarti pengiriman formulir biasanya dipanggil melalui drupal_form_submit(), sehingga pengalihan akan merusak skrip yang dipanggil drupal_form_submit().
  • $form_state['rebuild'] === TRUE: berarti formulir perlu dibangun kembali tanpa pengalihan.
trampjuice
sumber
7

Untuk Drupal 7, saya mencoba ini pada modul khusus dan berfungsi. Itu juga dapat digunakan dalam tema:

function my_theme_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'contact_site_form') {
$form['#submit'][] = 'contact_form_submit_handler';
}
}

function contact_form_submit_handler(&$form, &$form_state) {
$form_state['redirect'] = 'thank-you-page-alias';
}

BTW, saya menemukan cuplikan ini di sini: https://gist.github.com/postrational/5768796

Ignacio Segura Postigo
sumber
4

Untuk mengarahkan ulang ke URL eksternal di Drupal 8, gunakan TrustedRedirectResponsekelas, seperti dalam kode berikut.

$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
DRUPWAY
sumber
Jika itu bisa membantu, kita perlu memasukkan kelas ini dengan usekata kunci dan ruang namanya:use Drupal\Core\Routing\TrustedRedirectResponse;
Sébastien Gicquel
2

Pada D8 saya suka ini (tapi ini tidak akan berhasil ... lihat di bawah):

/**
* Implements hook_form_FORM_ID_alter().
*/
function MYMODULE_form_FORM_ID_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {

   // Force redirect to "/thankyou" page
   $url = "/thankyou";
   $path = \Drupal::service('path.alias_manager')->getPathByAlias($url);
   if(preg_match('/node\/(\d+)/', $path, $matches)) {
     $form_state->setRedirect('entity.node.canonical',
       array('node' => $matches[1])
     );    
   }

}

Edit /

Saya tidak ada yang berfungsi setRedirect / setRedirectUrl SETELAH modul dikirimkan, jadi ini adalah solusi kerja saya pada D8:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function MYMODULE_form_FORM_ID_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {
  $form['actions']['submit']['#submit'][] = 'MYFORM_redirect_handler';
}

function MYFORM_redirect_handler($form, FormStateInterface $form_state) {
  // Force redirect to "/sent"
  $dest_url = "/sent";
  $url = Url::fromUri('internal:' . $dest_url);
  $form_state->setRedirectUrl( $url );
}

Semoga ini bisa membantu

nessunluogo
sumber
1

Untuk drupal 7 jika Anda ingin mengarahkan ulang ke url dengan params likesomeurl?param1=1&param2=2

$query = array(
  'param1' => '1',
   'param2' => '2',
 );
$form_state['redirect'] = array(
    'someurl',
    array(
      'query'    => $query,
      'fragment' => 'hash_fragment',
    ),
  );
berramou
sumber