it-swarm-id.com

Cara mengalihkan ke halaman setelah mengirimkan formulir

Saya memiliki modul khusus yang menampilkan formulir.

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

Bagaimana saya bisa melakukan itu?

24
Carlos Muñiz

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);
31
googletorp

Perlu dicatat ada beberapa pemicu yang dapat mencegah pengalihan:

  • $form_state['redirect'] === FALSE: Jika disetel, fungsi form builder atau validasi form/submit handler tidak ingin pengguna diarahkan, yang berarti drupal_goto() tidak dipanggil. Untuk sebagian besar bentuk, logika pengalihan akan sama terlepas dari apakah $form_state['redirect'] Tidak didefinisikan atau SALAH. Namun, jika itu tidak didefinisikan dan permintaan saat ini berisi string kueri 'tujuan', drupal_goto() akan mengarahkan ulang ke tujuan yang diberikan sebagai gantinya. Hanya mengatur $form_state['redirect'] Ke FALSE akan mencegah pengalihan.
  • $form_state['no_redirect'] === TRUE: Ketika diatur, callback yang semula membangun formulir secara eksplisit melarang pengalihan apa pun, terlepas dari nilai pengalihan di $form_state['redirect']. Misalnya, ajax_get_form() mendefinisikan $form_state['no_redirect'] Ketika membangun formulir dalam panggilan balik AJAX untuk mencegah pengalihan. $form_state['no_redirect'] TIDAK boleh diubah oleh fungsi form builder atau validasi form/kirim penangan.
  • $form_state['programmed'] === TRUE: berarti pengiriman formulir biasanya dipanggil melalui drupal_form_submit(), sehingga pengalihan akan merusak skrip yang memanggil drupal_form_submit().
  • $form_state['rebuild'] === TRUE: berarti formulir perlu dibangun kembali tanpa pengalihan.
17
trampjuice

Untuk Drupal 7, saya mencoba ini pada modul khusus dan berhasil. Ini 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

Untuk mengarahkan ulang ke URL eksternal di Drupal 8, gunakan TrustedRedirectResponse kelas, seperti pada kode berikut.

$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
4
DRUPWAY

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

2
nessunluogo

For drupal 7 jika Anda ingin mengarahkan ulang ke url dengan params seperti someurl?param1=1&param2=2

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