Saya memiliki modul khusus yang menampilkan formulir.
Setelah mengirimkan formulir, saya ingin mengarahkan pengguna ke halaman lain.
Bagaimana saya bisa melakukan itu?
Saya memiliki modul khusus yang menampilkan formulir.
Setelah mengirimkan formulir, saya ingin mengarahkan pengguna ke halaman lain.
Bagaimana saya bisa melakukan itu?
Jawaban:
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);
/my-form?destination=node/123
.
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 FALSE
akan 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.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
Untuk mengarahkan ulang ke URL eksternal di Drupal 8, gunakan TrustedRedirectResponse
kelas, seperti dalam kode berikut.
$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
use
kata kunci dan ruang namanya:use Drupal\Core\Routing\TrustedRedirectResponse;
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